前几日看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_procreturn Proc.new do |item|item.__send__ selfend
end

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

a='upcase'
class << a def to_procreturn Proc.new do |item|item.__send__ selfendend
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

转载于:https://www.cnblogs.com/suncoolcat/p/3339351.html

Ruby中,:(ampersand colon)的用法相关推荐

  1. ruby中Thor用法雷神介绍,MyCLI < Thor详细介绍

    作者:小白蒋,个人博客:www.nihao070.cn ruby中thor详细用法 ruby中Thor是什么? 第一点:公共方法变成命令 第二点:你也可以使用Ruby的可选参数使CLI参数可选 第三点 ...

  2. Ruby中的设计模式——《松本行弘的程序世界》

    < 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...

  3. 在Ruby中获取system()调用的输出

    本文翻译自:Getting output of system() calls in Ruby 如果我在Ruby中使用Kernel#system调用命令,我该如何获得它的输出? system(" ...

  4. matlab中fdyn,Matlab的用法总结

    1. 对序列进行洗牌 randperm() randperm()产生随机的序列 %if filepaths 是一个5*1的结构体,then cshuffle = randperm(length(fil ...

  5. (Ruby)Ruby中区块用的一些潜藏关键字

    也许是我看的书并不系统,而且是在这本书上看几个章节,在另外一本书上看了其他几个章节,以致获取到的知识有时候没有连续性. 最近在琢磨Ruby中的迭代和C#中迭代的写法以及用法上的一些异同,发现了&quo ...

  6. Ruby中的字符串与符号

    原文引用:http://blog.csdn.net/besfanfei/article/details/7966987 初学Ruby的时候,往往对字符串(String类)与符号(Symbol)这两种变 ...

  7. Ruby中的类与对象(一)

    一些约定: 类名首字母大写 方法名首字母小写 end在Ruby中无处不在. 声明类 class BookInStock end 创建类对象 a_book = BookInStock.new anoth ...

  8. [2]rubyruby on rails入门笔记---Ruby中的异常

    Ruby中异常处理非常的重要,Ruby中异常处理,包括Exception 捕获,Retry,Raise,ensure ,Else格式,Throw...Catch已经类级别的异常.其具体格式和用法如下. ...

  9. Ruby中的inject

    Ruby中的inject  参考: ruby-inject 刚接触inject时,对其了解不是很深,直看到这篇文章 ruby-inject ,才有了新的认识,文章配合大量例子进行说明.  1.先看最简 ...

  10. PHP中魔术方法的用法

    PHP中魔术方法的用法 /** PHP把所有以__(两个下划线)开头的类方法当成魔术方法.所以你定义自己的类方法时,不要以 __为前缀. * */// __toString.__set.__get__ ...

最新文章

  1. 【自然语言处理】hmm隐马尔可夫模型进行中文分词 代码
  2. windows防火墙命令
  3. python3 判断list是否包含另一个list
  4. cgdb基本用法总结
  5. java 教室借用管理系统_教师办事指南 | 借用教室
  6. EasyUI 1.3.6 行号显示不全
  7. php pdo 执行多条语句,php – 在pdo预处理语句中执行多插入或多个不同插入是更好/更快?...
  8. 杭电1232畅通工程
  9. Bash:把粘贴板上的内容拷贝的文件中。(脚本)
  10. +++程序员高手修炼之路
  11. 图片预览------photoswipe 使用
  12. C++纯虚函数与抽象类
  13. 路径还原(求两个点之间最短距离的路径)
  14. c语言定义64位的变量,李洪强-C语言9-C语言的数据,变量和常量
  15. linux最小化连接开放wifi,CentOS最小化安装后启用无线连接网络
  16. swfupload 实例 php,文件上传之SWFUpload插件(代码)_php实例
  17. April Fools Day Contest 2016 F. Ace It!
  18. Visual Studio 2005超级集成版本下载
  19. python股票策略_浅谈python量化 双均线策略(金叉死叉)
  20. qiankun加载vue子应用报错[import-html-entry]: error occurs while executing normal script

热门文章

  1. 计算机视觉:让冰冷的机器看懂多彩的世界
  2. Cenos 软件安装
  3. linux 内核调试方法
  4. js获取网页的各种高度
  5. Android在线开发工具 App Inventor
  6. Windows 2003 安装WLM2009/MSN9错误的另一种解决办法
  7. HTTP 协议中的 cookie
  8. ElasticSearch之Java Api 测试
  9. 利用 Vmware 安装 Linux 虚拟机
  10. TOML-to-Go : 帮你快速生成 Go 结构体