关于Ruby的语法问题:
p = lambda &:upcase
p.call('a') ## A
为什么它有效?这个' upcase'来自?
我认为没有一个参数应该发送到upcase
,为什么这个proc可以有一个参数?
答案 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
获得一个空参数列表。