• 締切済み

rubyでメソッド内で引数名、値を取得

Rubyでメソッドの引数名をメソッド内部で取得するような事は可能でしょうか? def hoge(a,b,c) # ここでa,b,cの引数名、またその値を取得 # 例えば、{:a=>1, :b=>2, :c=>3}のようにHashの形式で得るなど。 end local_variablesだと、引数も含まれますがその他で定義したものも拾ってしまうため、他の方法を探しています。 わかる方がいれば教えていただけますでしょうか。

  • Ruby
  • 回答数3
  • ありがとう数0

みんなの回答

回答No.3

def hoge(option = {})  option.each_paier do |k,v|   p k   p v   #なんかの処理  end end hoge(:hoge => "hoge", :piyo => "piyo") こんなのどうですか?

maenoina
質問者

補足

ご回答ありがとうございます。 提示いただいた方法で、結果的には意図するものは得られるのですが、今回、質問の内容を何らかの方法で解決するという意図より、 > def hoge(a,b,c) このように宣言されたメソッドに対して引数の情報(引数名、値など)をメソッド内で取得する方法が無いかを単純に興味も含め探しています。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

No1です。 >(引数に対してループをして、引数の情報の取得、処理を行う) ということであれば、def hoge(*args) と配列で受ければ良いのでは?

maenoina
質問者

補足

ご回答ありがとうございます。 提示いただいた方法で、結果的には意図するものは得られるのですが、今回、質問の内容を何らかの方法で解決するという意図より、 > def hoge(a,b,c) このように宣言されたメソッドに対して引数の情報(引数名、値など)をメソッド内で取得する方法が無いかを単純に興味も含め探しています。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

質問の意図がよくわかりませんが、自分で def hoge(a,b,c) と書いているのだから、引数は a b c だとわかりますよね?

maenoina
質問者

補足

はい、目視すればわかります。 ただ、今回の狙いとしてメソッド内で引数全てに対してのループ処理を行たかったのです。 (引数に対してループをして、引数の情報の取得、処理を行う) そもそもループさせるほどの引数の多さなども問題ではあるのですが、興味も含めて今回の質問のような処理が可能なのかどうかを知りたいと思っていました。

関連するQ&A

  • メソッド定義の際の引数で

    楽しいRuby第4版のp.120で def a(a, b: 0, c:0)  [a, b, c] end のように、必須の引数とキーワード引数を混在 させることができると説明があったので試しに def meth(a, b: 2, c: 3, *args)  [a, b, c, args] end p meth(1,2,3) のように、必須の引数とキーワード引数と不定の 引数を混在させたところエラーが返りました。 やはり、不定の引数*argsまで混在させられないの でしょうか? irbで試すとメソッド定義をendで括った瞬間に エラーが返りましたんで、きっとこれが原因だと 思うのですが。

    • ベストアンサー
    • Ruby
  • Ruby 特異メソッドのnewが先に実行?

    Rubyのインスタンス生成について質問があります。 通常クラスを定義する場合は class Hoge ; def hello(); pirnt "hello"; end であると思います。 ただ Hoge = Class.new(); でもクラスは定義できるとききました。 ただこの場合Hogeクラスに定義できるのは HogeというClassクラスから作られた特異クラスとしてのHogeに 特異メソッドのみを定義できるということですよね? 通常のインスタンスメソッドは定義できませんよね? ではでは、 hoge = Class.new(); とした場合はどうなるのでしょうか? この場合は Classクラスの純粋なインスタンスとなるのでしょうか? 前者の定義とおなじ仕方ですが代入先が、通常の変数です。 この場合は、クラスオブジェクトとして生成されるのですか? オンラインマニュアルをみたところ 「新しく名前の付いていない superclass のサブクラスを生成します。 superclass が省略された時にはObject のサブクラスを生成します。 名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。」 とあります。 上記内容は Classクラスの特異クラスとして定義されている特異メソッド(new)です。 これは Class.new()で作られたインスタンスを代入する先が定数であればその定数名と同じクラスを定義しつつそのClassクラスのクラスオブジェクトを生成するという意味合いでまちがいないでしょうか? 上記のとおりであれば hoge =Class.new()の場合は、やはりhogeというクラスを定義することになるのでしょうか? クラス定義は定数でなければならないはずですよね。 ただ実際、 p hoge;として出力すると#とひょうじされています。これはhogeがクラスオブジェクトではなく ただのインスタンスであるということでしょうか? であるならばこの hoge = Class.new()の式のnewはClassクラスオブジェクトに定義された特異メソッドではなく Classクラスに定義されたnewメソッド・・・・・つまりClassクラスに定義されたインスタンスメソッドの方のnewメソッドだとおもうのですが・・・・・・。 つまりこちらのメソッドですね。 「new( ... ) クラスのインスタンスを生成して返します。このメソッドの引数はブロック引数も含め initialize に渡されます。」 ※オンラインリファレンスから参照しました。 しかし 通常メソッドの検索は特異メソッドからはじまりその後クラスのインスタンスメソッド->親クラスのメソッドと 検索して行くとあります。 必ず先に、特異メソッドを実行しているはずだと思うのですが・・・。 やはり特異メソッドnewを実行しているのでしょうか? 長々すみませんが、ご教授ください。

    • ベストアンサー
    • Ruby
  • Rubyのsuperclassメソッドについて

    Rubyについての質問です。処理系は1.8.7です。 class Foo def initialize(a) @a = a end end のようなクラスを作成し、そのインスタンスを foo = Foo.new(1) のように作成します。 このとき、 foo.superclassを呼び出すと NoMethodError: undefined method `ancestors' for #<Foo:0x2b691220cc88 @a=1> とエラーになります。 一方で class FooExt < Foo def initialize (a,b) @b = b super a end end のようにFooを継承したクラスを作り、 fooext = FooExt.new(1,2) fooext.superclass とすると => Foo とsuperclassメソッドが動作します。 このsuperclassメソッドはどこで追加されたものなのでしょうか?

  • Ruby 同じ名前のメソッド

    始めましてよろしくお願いします。 さっそくなんですが Rubyで class A def dash( a, b ) end def dash( a ) end end というような使い方をしたいのですが どのように書けばいいのでしょうか? ちなみにこの書き方だと、後に書いた dash( a ) の方だけが有効になりました。

  • クラスメソッドのインスタンスメソッドからの呼び出し

    クラスメソッド“say”を定義しました。 クラス外からこれを呼び出すときは Hoge.say 'hello' で、同じクラス内の、インスタンスメソッド“hello”からクラスメソッド“say”を呼び出したいとき、クラス外から呼び出すのと同じように呼び出すことはできました。 class Hoge  def self.say(word)   puts word  end  def hello   Hoge.say('hello')  end end しかし、メソッド“hello”内にHogeというクラス名を直書きしたくないのですが、どんな文法を使用すればよろしいでしょうか? # Hoge#hello内での試行錯誤 self.say 'hello' => エラー say 'hello' => エラー ひょっとして、クラス名を直書きする以外手段はないのでしょうか・・?

    • ベストアンサー
    • Ruby
  • 匿名クラス内のメソッドをオーバーライド。実引数はいつどこから来るのでしょうか?

     お世話になっております。 匿名クラス内のメソッドをオーバーライドするときの引数についての質問なのですが File d = new File("F:\\dir"); File[] d2 = d.listFiles(new FileFilter(){ public boolean accept(File hoge){ return hoge.toString().endsWith(".txt"); } } ); オーバーライドしたacceptメソッドの仮引数のFile型のhogeがありますが このacceptメソッドの実引数はいつどこから来るのでしょうか? このacceptメソッドの実引数はどこで「acceptメソッドの呼び出し」で指定すればよいでしょうか? その他ActionEvent e などの仮引数も謎です。 どうかよろしくご指導お願いいたします。

    • ベストアンサー
    • Java
  • Javaでメソッドの引数にメソッド

    以下のようにメソッドの引数にメソッドを渡したいです。 static void methodA(methodB, str) { methodB(str); } static void methodB(str) { System.out.println(str); } つまりメソッドAにメソッド名「methodB」と文字列「str」を渡して、間接的にメソッドBを実行させたいということです。 getMethodやinvokeを使うのかなとは思ったのですが、よく理解できませんでした。 上記のようなことは可能でしょうか?

    • ベストアンサー
    • Java
  • {Ruby}Dir.globの結果を引数として代入

    こんにちは。 当方Ruby初心者です。 最近Dir.globのメソッドを使用しているのですが、 Dir.globで取得した結果を1つずつ引数として取り出すにはどのようなメソッドを 組めば良いのでしょうか? ご教授の程よろしくお願い致します。

  • 自作したメソッド・・・引数はなるべく省略すべき?(VB2005)

    自作したメソッドに関して、引数はなるべく設定するべきでしょうか?それとも、引数は省略できるなら省略したほうがよいでしょうか? 下記(a)、(b)は例です。 a)引数はなるべく省略   ---------------------------------   Private Sub hoge()     Call foo()   End Sub   Private Sub foo()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     '処理   End Sub   --------------------------------- b)あえて引数を設定   ---------------------------------   Private Sub hoge()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     Call foo(hoga)   End Sub   Private Sub foo(ByVal hoga As integer)     '処理   End Sub   --------------------------------- 現在、(b)のようにあえて引数を設定したほうが、呼び出し先のメソッドがどういう処理を行っているかを掴めていいかな?と考え始めています。 ご助言よろしくお願い致します。

  • アサーションでメソッドの引数をチェックする

    お世話になります。 SJC-P取得のための勉強をしている中で、 次の疑問点があります。 ------------------------------------------ アサーションの使い方として、 (1)publicメソッドの引数をアサーションでチェックする--->ふさわしくない使い方 (2)privateメソッドの引数をアサーションでチェックする--->正しい使い方 ------------------------------------------ 以下のような解釈かと(無理やり)考えました。 privateメソッドは、自分自身しか使わない?ため、 引数に変な値を渡すことは無い。 publicメソッドは、他の人も使う可能性があり、 引数に変な値を渡すことが十分有りうる。 有り得る/有り得ないで、アサーションの 使う/使わないを決める??? しかしいまいちピンときません。 わかりやすく教えていただけませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう