2012-06-21 1 views
4

J'ai découvert ce matin que proc.new fonctionne dans une méthode de initialisation de classe, mais pas lambda. Concrètement, je veux dire:Ruby proc vs lambda dans 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 

Dans le cas ci-dessus, le résultat sera:

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

Pourquoi?

Merci!

Répondre

6

Le fait que vous avez défini un attr_accessor appelé lambda se cache la méthode lambda originale qui crée un bloc (si votre code se cache efficacement Ruby lambda). Vous devez nommer l'attribut quelque chose d'autre pour que cela fonctionne:

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

L'appel de 'Kernel.lambda' est une autre option. – Casper