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
- Ruby中,&:(ampersand-colon,"与号-冒号")的用法
- Matlab 冒号(colon)的使用
- Jquery-中括号与冒号([]与:)的用法
- java String replace :(冒号)colon
- c++中冒号(:)和双冒号(::)的区别与用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- c++中冒号(:)和双冒号(::)的用法
- 在AWK中输出特殊字符-单引号
- struts2中一个很实用的标签
- 数据结构与算法分析:第一章:Finding the kth largest number and The four basic rules of recursion
- C#_delegate - 用委托实现事件,Display和Log类都使用Clock对象
- (void) (&_x == &_y)
- Ruby中,&:(ampersand-colon,"与号-冒号")的用法
- C#:System.Array简单使用
- Expected authority at index 7: hdfs://
- 初识Linux—3
- MFC--SendMessage、PostMessage原理
- 计算机科学中最重要的32个算法
- C语言与金属材料
- 为什么本机上无法用127.0.0.1登录SQL Server
- 【Android】“微信”apk中的“发现”和“我”两个模块的布局