2017-06-28 5 views
0

実行時にシンボルの配列で指定された引数の固定リスト、または名前付きパラメータの固定ハッシュでメソッドを動的に作成するにはどうすればよいですか?はい、私は任意の引数を受け入れるためにスポット演算子を使用することができますが、引数がランタイム配列(またはハッシュ)と一致しないときはいつでも、静的な場合と同様にArgumentErrorを発生させたいと思います。動的ではあるが固定引数リストを含むメソッドを動的に作成し、define_methodをrubyで作成しますか?

は静的に、私は今、私は、実行時に、このメソッドを作成したい

def foo(bar,baz) 
    [bar,baz] 
end 

foo(1,2) #=>[1,2] 
foo(1,2,3) #=> ArgumentError: wrong number of arguments (given 3, expected 2) 

を書きます。 define_method: How to dynamically create methods with argumentsによると、私たちはただ

define_method(:foo) do |bar,baz| 
    [bar,baz] 
end 

foo(1,2) #=> [1,2] 
foo(1,2,3) #=> ArgumentError: wrong number of arguments (given 3, expected 2) 

しかし、メソッドを書くとき、私は引数リストを知っている場合にのみ動作することができ。実行時に引数リストしかない場合はどうなりますか?

define_method(:foo) do |*args| 
    args 
end 

foo(1,2) #=> [1,2] 
foo(1,2,3) #=> [1,2,3] 

しかしように、私たちは、静的コードを複製、実行時に与えられた引数のリストに適合するために許可された引数を修正することができます:How do you pass arguments to define_method?で、我々が引数のいずれかの配列を受け入れるようにスプラット演算子を使用することができます示唆されました次のことが起こりますか?私は考えることができる

arr = [:bar,:baz] 

define_method(:foo) do |*args=arr| #or some other magic here 
    args 
end 

foo(1,2) #=> [1,2] 
foo(1,2,3) #=> ArgumentError: wrong number of arguments (given 3, expected 2) 
+0

これは、https://stackoverflow.com/q/33425935/336563 – ziggurism

+0

の複製でもあります。https://stackoverflow.com/q/15868381/336563 – ziggurism

答えて

0

一つの方法は、引数の数が予想と一致しない場合は、設定を明示的args.countraise ArgumentErrorをチェックすることです:

class Foo 
    def self.create_method(method_name, number_of_arguments) 
    define_method(:"#{method_name}") do |*args| 
     if args.count > number_of_arguments 
     raise ArgumentError, "wrong number of arguments (given #{args.count}, expected #{number_of_arguments})" 
     end 

     puts "Inside #{method_name}, recevied arguments: #{args.join(", ")}" 
    end 
    end 
end 

出力:

Foo.create_method("yolo", 2) 
Foo.new.yolo("arg1", "arg2") // Inside yolo, recevied arguments: arg1, arg2 
Foo.new.yolo("arg1", "arg2", "arg3") // wrong number of arguments (given 3, expected 2) (ArgumentError) 
+0

そして、もし私がruby 2のキーワード引数を含んでいたら?はい、私はダブルスプラットを含めることができ、すべてのハッシュキーをチェックすることができます。しかし、私は多くの複雑なコードを再実装しています。もしRubyが 'def _method_'が使用するのと同じパラメータの署名チェックにアクセスすることができればいいですか? – ziggurism

関連する問題