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_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)的用法相关推荐
- ruby中Thor用法雷神介绍,MyCLI < Thor详细介绍
作者:小白蒋,个人博客:www.nihao070.cn ruby中thor详细用法 ruby中Thor是什么? 第一点:公共方法变成命令 第二点:你也可以使用Ruby的可选参数使CLI参数可选 第三点 ...
- Ruby中的设计模式——《松本行弘的程序世界》
< 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...
- 在Ruby中获取system()调用的输出
本文翻译自:Getting output of system() calls in Ruby 如果我在Ruby中使用Kernel#system调用命令,我该如何获得它的输出? system(" ...
- matlab中fdyn,Matlab的用法总结
1. 对序列进行洗牌 randperm() randperm()产生随机的序列 %if filepaths 是一个5*1的结构体,then cshuffle = randperm(length(fil ...
- (Ruby)Ruby中区块用的一些潜藏关键字
也许是我看的书并不系统,而且是在这本书上看几个章节,在另外一本书上看了其他几个章节,以致获取到的知识有时候没有连续性. 最近在琢磨Ruby中的迭代和C#中迭代的写法以及用法上的一些异同,发现了&quo ...
- Ruby中的字符串与符号
原文引用:http://blog.csdn.net/besfanfei/article/details/7966987 初学Ruby的时候,往往对字符串(String类)与符号(Symbol)这两种变 ...
- Ruby中的类与对象(一)
一些约定: 类名首字母大写 方法名首字母小写 end在Ruby中无处不在. 声明类 class BookInStock end 创建类对象 a_book = BookInStock.new anoth ...
- [2]rubyruby on rails入门笔记---Ruby中的异常
Ruby中异常处理非常的重要,Ruby中异常处理,包括Exception 捕获,Retry,Raise,ensure ,Else格式,Throw...Catch已经类级别的异常.其具体格式和用法如下. ...
- Ruby中的inject
Ruby中的inject 参考: ruby-inject 刚接触inject时,对其了解不是很深,直看到这篇文章 ruby-inject ,才有了新的认识,文章配合大量例子进行说明. 1.先看最简 ...
- PHP中魔术方法的用法
PHP中魔术方法的用法 /** PHP把所有以__(两个下划线)开头的类方法当成魔术方法.所以你定义自己的类方法时,不要以 __为前缀. * */// __toString.__set.__get__ ...
最新文章
- 【自然语言处理】hmm隐马尔可夫模型进行中文分词 代码
- windows防火墙命令
- python3 判断list是否包含另一个list
- cgdb基本用法总结
- java 教室借用管理系统_教师办事指南 | 借用教室
- EasyUI 1.3.6 行号显示不全
- php pdo 执行多条语句,php – 在pdo预处理语句中执行多插入或多个不同插入是更好/更快?...
- 杭电1232畅通工程
- Bash:把粘贴板上的内容拷贝的文件中。(脚本)
- +++程序员高手修炼之路
- 图片预览------photoswipe 使用
- C++纯虚函数与抽象类
- 路径还原(求两个点之间最短距离的路径)
- c语言定义64位的变量,李洪强-C语言9-C语言的数据,变量和常量
- linux最小化连接开放wifi,CentOS最小化安装后启用无线连接网络
- swfupload 实例 php,文件上传之SWFUpload插件(代码)_php实例
- April Fools Day Contest 2016 F. Ace It!
- Visual Studio 2005超级集成版本下载
- python股票策略_浅谈python量化 双均线策略(金叉死叉)
- qiankun加载vue子应用报错[import-html-entry]: error occurs while executing normal script