2012-06-21 3 views
4

Я узнал сегодня утром, что proc.new работает в методе инициализации класса, но не лямбда. В частности, я имею в виду: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_accessor называется lambda скрывается оригинальный lambda метод, который создает блок (так что ваш код эффективно скрывается рубина 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

Смежные вопросы