2010-07-18 7 views
2

Je suis confus par la définition de la liaison de bloc dans ruby. Voici deux exemples:Bloc de liaison dans Ruby

def redfine_a(&block) 
    a = 2 
    puts eval("a", block.binding) 
    block.call 
end 
a = "hello" 
puts redfine_a {a} 

Celui-ci pourrait fonctionner avec le résultat attendu, tandis que le second:

def redefine_a(&block) 
    a= 2 
    puts eval("a", block.binding) 
    block.call 
end 

puts redefine_a{a= "hello"} 

se plaindront:

undefined local variable or method `a' for main:Object (NameError) 

Après avoir enlevé le puts eval("a", block.binding), mon code run:

def redefine_a(&block) 
    a= 2 
    block.call 
end 

puts redefine_a{a= "hello"} 

Où est-ce que je me trompe?

Répondre

9

block.binding est l'environnement dans lequel le bloc est défini avant son exécution.

3

Dans votre code le contexte dans lequel le bloc est défini est l'objet main, de sorte que la ligne eval("a", block.binding) renvoie la valeur de a dans main. Dans votre premier exemple a est défini dans main et donc le code s'exécute, dans le deuxième exemple il n'y a pas de a dans le principal et donc l'erreur.

Dans les deux cas cependant, le a=2 dans votre méthode redefine_a peut avoir aucun effet.

Questions connexes