Ruby中,&:(ampersand-colon,"与号-冒号")的用法

来源:互联网 发布:微信上免费送礼品淘宝 编辑:程序博客网 时间:2024/05/22 04:43

前几日看Ruby代码,发现一个奇怪的用法,如下:

a=['a', 'b', 'c'].map! &:upcasep 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, *params|     item.__send__ self, *params  endend

知道了原理后,我们现在可以自己为String变量实现一个类似的功能:

a='upcase'class << a   def to_proc    return Proc.new do |item, *params|      item.__send__ self, *params    end  endendp ['a', 'b', 'c'].map! &a #["A", "B", "C"]

下面是一个带参数的例子:

a='gsub'class << a   def to_proc    return Proc.new do |item, *params|      p item.__send__ self, *params    end  endenddef method  ['oh', 'hello', 'world'].each do |v|    yield v, /o/, 'O'  endendmethod &a#Oh#hellO#wOrld



参见:

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