在ruby中&实际上是一个关键字,当ruby 看见这个“&” 符号的时候他会他 “&” 符号后面的内容调用了"to_proc"方法转化为一个代码块。
比如:
a=[1,2,3,4,5,6]
irb> #=> [1, 2, 3, 4, 5, 6]
a.map(&:to_s)
["1", "2", "3", "4", "5", "6"]
irb> #=> :to_s.to_proc
irb> #=> => #<Proc:0x005577886e4650(&:to_s)> #可以看到返回的确实是一个代码块。
& 后面 规定可以放 对象(:symbol也是对象),其他的数字或者字符串是不可以的。
贴个代码自己体会
## case 1
class Symbol
def to_proc
proc { |x| x.send(self) }
end
end
p [1, 2, 3].map &:to_s
p [1, 2, 3].map &proc { |x| x*x }
puts "*" * 50
## case 2
class ProcStore
def initialize handler
@handler = handler
end
def to_proc
proc { |ele| send(@handler, ele) }
end
def hi ele
"hi #{ele}"
end
def hello ele
"hello #{ele}"
end
end
p [1, 2, 3].map &ProcStore.new(:hi)
p [1, 2, 3].map &ProcStore.new(:hello)
puts "*" * 50
## case 3
def test x
"test #{x}"
end
p [1, 2, 3].map &method(:test)