什么和&:upcase在Ruby中意味着什么

时间:2014-11-21 05:41:16

标签: ruby

关于Ruby的语法问题:

p = lambda &:upcase 
p.call('a')    ## A

为什么它有效?这个' upcase'来自?
我认为没有一个参数应该发送到upcase,为什么这个proc可以有一个参数?

1 个答案:

答案 0 :(得分:1)

第一个参数是接收器。

lambda(&:upcase)

的简写
lambda { |x| x.upcase }

就像

一样
lambda(&:+)

的简写
lambda { |x, y| x.+(y) }

更准确地说,参数中的&x会调用x.to_proc; Symbol#to_proc恰好返回上述内容。例如,这是来自Rubinius来源的Symbol#to_proc的定义:

class Symbol
  # Returns a Proc object which respond to the given method by sym.
  def to_proc
    # Put sym in the outer enclosure so that this proc can be instance_eval'd.
    # If we used self in the block and the block is passed to instance_eval, then
    # self becomes the object instance_eval was called on. So to get around this,
    # we leave the symbol in sym and use it in the block.
    #
    sym = self
    Proc.new do |*args, &b|
      raise ArgumentError, "no receiver given" if args.empty?
      args.shift.__send__(sym, *args, &b)
    end
  end
end

正如您所看到的,结果Proc将移出第一个参数作为接收器,并传递其余参数。因此,"a"是接收者,因此"a".upcase获得一个空参数列表。