receiver_method(&:method)功能似乎足够清楚,但是我在关于分配给' obj '的解释*中发现了一个空白
class Symbol
def to_proc #<parameter notably absent>
Proc.new { |obj, *args|
obj.send (self, *args)
}
end
end
这如何将接收者方法的object / passed参数指定为'obj'?
* What does map(&:name) mean in Ruby?
* https://www.skorks.com/2013/04/ruby-ampersand-parameter-demystified/
答案 0 :(得分:1)
“&”号如何将参数作为
#to_proc
传递给“obj”
? —receiving_method(&:method)
Ampersand不会在任何地方传递任何东西。 “&”号将自变量转换为proc
实例,并在其上隐式调用to_proc
。并将结果作为一个块传递给调用者。
让我们坚持这个例子:
%w[42 foo].map(&:to_i)
#⇒ [42, 0]
这是怎么回事?
•如您在OP中所示,to_i
被转换为proc
# ⇓⇓⇓⇓⇓
proc { |obj, *args| obj.send(:to_i, *args) }
•我们将此proc
传递给调用方(在不失一般性的情况下,为了清楚起见,我将使用块语法编写它
%w[42 foo].map do |obj, *args|
obj.send(:to_i, *args)
end
• NB! *args
在此处是越位的,因为map
将单个参数传递给块:
%w[42 foo].map do |obj|
obj.send(:to_i)
end
那会映射:
'42' → '42'.send(:to_i) ≡ '42'.to_i → 42,
'foo' → 'foo'.send(:to_i) ≡ 'foo'.to_i → 0,
收益:
#⇒ [42, 0]