可能的重复: map(&:name)在Ruby中是什么意思?
在Ruby中,我知道如果我这样做:
some_objects.each(&:foo)
这和
some_objects.each { |obj| obj.foo }
也就是说,&:foo创建块{|obj| obj。foo},将其转换为Proc,并将其传递给每个Proc。为什么会这样?这只是Ruby的特殊情况,还是有原因为什么这样工作?
可能的重复: map(&:name)在Ruby中是什么意思?
在Ruby中,我知道如果我这样做:
some_objects.each(&:foo)
这和
some_objects.each { |obj| obj.foo }
也就是说,&:foo创建块{|obj| obj。foo},将其转换为Proc,并将其传递给每个Proc。为什么会这样?这只是Ruby的特殊情况,还是有原因为什么这样工作?
当前回答
符号和符号的组合并没有什么特别之处。下面是(ab)使用正则表达式的例子:
class Regexp
def to_proc
->(str) { self =~ str ; $1 }
end
end
%w(station nation information).map &/(.*)ion/
=> ["stat", "nat", "informat"]
或整数。
class Integer
def to_proc
->(arr) { arr[self] }
end
end
arr = [[*3..7],[*14..27],[*?a..?z]]
arr.map &4
=> [7, 18, "e"]
当你有arr.map(&:fifth)时,谁还需要arr.map(&:fifth)呢?地图和4 ?
其他回答
符号和符号的组合并没有什么特别之处。下面是(ab)使用正则表达式的例子:
class Regexp
def to_proc
->(str) { self =~ str ; $1 }
end
end
%w(station nation information).map &/(.*)ion/
=> ["stat", "nat", "informat"]
或整数。
class Integer
def to_proc
->(arr) { arr[self] }
end
end
arr = [[*3..7],[*14..27],[*?a..?z]]
arr.map &4
=> [7, 18, "e"]
当你有arr.map(&:fifth)时,谁还需要arr.map(&:fifth)呢?地图和4 ?
可以说,你的问题是错的。这里发生的不是“&和冒号”,而是“&和对象”。在这种情况下,冒号是符号。这里有&和:foo。
&调用对象上的to_proc,并将其作为块传递给方法。在Ruby中,to_proc是在Symbol上实现的,所以这两个调用是等价的:
something {|i| i.foo }
something(&:foo)
所以,总结一下:&在对象上调用to_proc并将其作为块传递给方法,Ruby在Symbol上实现to_proc。