Ampersand 如何将参数作为 "obj" 传递给 #to_proc? —receiving_method(&:方法)
How does Ampersand pass arguments into #to_proc as "obj"? —receiving_method(&:method)
receiver_method(&:method) 功能似乎很清楚,但我发现关于 assignment to '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/
How does Ampersand pass arguments into #to_proc
as “obj”
? — receiving_method(&:method)
Ampersand 不会在任何地方传递任何东西。 Ampersand 将参数转换为 proc
实例,隐式调用 to_proc
。并将结果作为一个块传递给调用者。
让我们继续举个例子:
%w[42 foo].map(&:to_i)
#⇒ [42, 0]
这是怎么回事?
• to_i
正在转换为 proc
,如您在 OP
中所示
# ⇓⇓⇓⇓⇓
proc { |obj, *args| obj.send(:to_i, *args) }
• 我们将此 proc
传递给调用者(不失一般性,为了清楚起见,我将使用块语法编写它
%w[42 foo].map do |obj, *args|
obj.send(:to_i, *args)
end
• 注意! *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]
receiver_method(&:method) 功能似乎很清楚,但我发现关于 assignment to '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/
How does Ampersand pass arguments into
#to_proc
as“obj”
? —receiving_method(&:method)
Ampersand 不会在任何地方传递任何东西。 Ampersand 将参数转换为 proc
实例,隐式调用 to_proc
。并将结果作为一个块传递给调用者。
让我们继续举个例子:
%w[42 foo].map(&:to_i)
#⇒ [42, 0]
这是怎么回事?
• to_i
正在转换为 proc
,如您在 OP
# ⇓⇓⇓⇓⇓
proc { |obj, *args| obj.send(:to_i, *args) }
• 我们将此 proc
传递给调用者(不失一般性,为了清楚起见,我将使用块语法编写它
%w[42 foo].map do |obj, *args|
obj.send(:to_i, *args)
end
• 注意! *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]