2012-06-21 31 views
4

今天早上我发现proc.new在类初始化方法中起作用,但不是lambda。具体而言,我的意思是:ruby​​ proc vs lambda in initialize()

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) 

这是为什么?

谢谢!

回答

6

您已经定义了一个名为attr_accessorlambda隐藏创建一个块中的原始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 
+1

调用'Kernel.lambda'是另一种选择。 – Casper