前几日看Ruby代码,发现一个奇怪的用法,如下:
a=['a', 'b', 'c'].map! &:upcase p a #["A", "B", "C"]
研究后知道,上面的用法等价于下面的代码:
a=['a', 'b', 'c'].map! &Proc.new{|item| item.__send__ :upcase } p a #["A", "B", "C"]
第一种写法的原理是:
&操作符会调用Symbol#to_proc方法,所以&:upcase相当于
&(:upcase.to_proc)
而Symbol#to_proc大概是这个样子滴:
def to_proc return Proc.new do |item| item.__send__ self end end
知道了原理后,我们现在可以自己为String变量实现一个类似的功能:
a='upcase' class << a def to_proc return Proc.new do |item| item.__send__ self end end end p ['a', 'b', 'c'].map! &a #["A", "B", "C"]
参见:
1、http://stackoverflow.com/questions/1961030/ruby-ampersand-colon-shortcut
2、http://stackoverflow.com/questions/1217088/what-does-ampersand-colon-pretzel-colon-mean-in-ruby