确定不调用方法如何绑定Ruby方法参数?

问题描述 投票:0回答:2

因为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中是否有类似(或类似)的东西?

提前感谢!

ruby arguments parameter-passing
2个回答
1
投票
A.instance_method(:foo).parameters => [[:req, :a], [:rest, :b], [:req, :c]]

http://www.ruby-doc.org/core-2.0/Method.html#method-i-parameters


0
投票
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}
© www.soinside.com 2019 - 2024. All rights reserved.