Ruby中,&:(ampersand colon)的用法

前几日看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


 

posted on 2013-09-25 19:13  新一  阅读(884)  评论(0编辑  收藏  举报

导航