因为Ruby中有几种不同类型的方法参数(必填,默认值,关键字,可变长度...),有时确定如何将实际参数绑定到形式参数可能很棘手。我想知道是否有一种方法来确定此绑定将是什么[[无需实际调用方法。例如,对于以下方法A#foo
:
class A
def foo(a, *b, c)
...
end
end
我想要像determine_binding
这样的方法,可以如下使用:
A.instance_method(:foo).determine_binding(1,2,3,4,5) ## returns { a: 1, b: [2,3,4], c: 5 }
即
determine_binding
接受参数列表并确定对foo
参数的形式绑定,而无需实际调用foo
。 Ruby中是否有类似(或类似)的东西?提前感谢!
A.instance_method(:foo).parameters => [[:req, :a], [:rest, :b], [:req, :c]]
http://www.ruby-doc.org/core-2.0/Method.html#method-i-parameters
module Watcher
def self.prepended(base)
base.instance_methods(false).map do |m|
mthd = base.instance_method(m)
names = mthd.parameters.map(&:last).map(&:to_s)
values = names.join(", ")
params =
mthd.parameters.map do |type, name|
case type
when :req then name.to_s
when :rest then "*#{name}"
when :keyrest then "**#{name}"
when :block then "&#{name}"
end
end.join(", ")
base.class_eval """
def #{m}(#{params})
names_as_symbols = #{names}
names_as_symbols.zip([#{values}]).to_h
end
"""
end
end
end
class A; def zoo(a, *b, c); 42; end; end
A.new.zoo(1,2,3,4,5)
A.prepend Watcher
A.new.zoo(1,2,3,4,5)
#⇒ {"a"=>1, "b"=>[2, 3, 4], "c"=>5}