我有以下代码:
def add_one(el)
el += 1
end
p [1,2,3].map { |el| add_one(el) }
p [1,2,3].map(&:add_one)
当我尝试&:add_one
时,我得到map: private method add_one called for 1:Fixnum (NoMethodError)
我在这里缺少什么?如何使用&:表示法调用add_one?
答案 0 :(得分:2)
将符号转换为proc的&
符号不起作用。它创建了一个块,传递给它的参数是方法调用的 receiver ,而不是参数。
p [1,2,3].map(&:add_one)
# is equivalent to this
p [1,2,3].map { |el| el.add_one }
如何使用&:表示法调用add_one?
你没有。在这种情况下,您根本不会使用简写形式。没有理由。
答案 1 :(得分:1)
实际上,您可以使用method
方法为&:
上的方法执行与self
类似的操作:
def add_one(el)
el += 1
end
p [1,2,3].map(&method(:add_one))
# [2, 3, 4]
答案 2 :(得分:0)
如果您有Active Record关系 例如,对于具有字段的用户:name,:age,:address 你可以用它:
users = User.all
所以你可以使用&:...
users.map(&:name) # => ['John', 'Oleg', 'Egor']
相同
users.map { |user| user.name }