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, *params|
     item.__send__ self, *params
  end
end

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

a='upcase'
class << a 
  def to_proc
    return Proc.new do |item, *params|
      item.__send__ self, *params
    end
  end
end
p ['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
  end
end
def method
  ['oh', 'hello', 'world'].each do |v|
    yield v, /o/, 'O'
  end
end
method &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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值