4

我今天早上发现 proc.new 在类初始化方法中工作,但不是 lambda。具体来说,我的意思是:

class TestClass

  attr_reader :proc, :lambda

  def initialize
    @proc = Proc.new {puts "Hello from Proc"}
    @lambda = lambda {puts "Hello from lambda"}
  end

end

c = TestClass.new
c.proc.call
c.lambda.call

在上述情况下,结果将是:

Hello from Proc
test.rb:14:in `<main>': undefined method `call' for nil:NilClass (NoMethodError)

这是为什么?

谢谢!

4

1 回答 1

6

attr_accessor您定义了一个被调用的事实lambda隐藏了创建块的原始lambda方法(因此您的代码实际上隐藏了 Ruby 的lambda)。您需要将属性命名为其他名称才能使其工作:

class TestClass

  attr_reader :proc, :_lambda

  def initialize
    @proc = Proc.new {puts "Hello from Proc"}
    @_lambda = lambda {puts "Hello from lambda"}
  end

end

c = TestClass.new
c.proc.call
c._lambda.call
于 2012-06-21T03:17:26.293 回答