2012-06-21 62 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