• 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|
         item.__send__ self
      end
    end

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

    a='upcase'
    class << a 
      def to_proc
      	return Proc.new do |item|
    			item.__send__ self
    		end
    	end
    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


  • 相关阅读:
    printf和sprintf
    操作数、运算符、表达式
    全自动加法机
    Ascll、GB2312、Ansi
    数组
    循环
    编程命名规范
    浮点数及缺陷
    Android编码规范
    RGB着色对照表
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3339351.html
Copyright © 2020-2023  润新知