Bloquer la portée à ruby
Ma compréhension était que ruby blocs bloc de portée, et toutes les variables créées à l'intérieur de bloc de vivre seule dans le bloc.
Exemple de cas:
food = ['toast', 'cheese', 'wine']
food.each { |food| puts food.capitalize}
puts food
De sortie:
"Toast"
"Cheese"
"Wine"
"Wine"
Si vous prenez le food
variable à l'intérieur du bloc (Chaque bloc), ma compréhension est qu'il a le bloc de portée. Il ne vit que dans le bloc de portée, et n'a aucune influence sur l'extérieur variable food
.
Mais le comportement est différent, à l'extérieur variable nommée food
est modifié dans ce cas. Est-ce la compréhension correcte, ruby ne nous avons bloc de portée?
source d'informationauteur 18bytes
Vous devez vous connecter pour publier un commentaire.
Ce comportement est normal pour ruby 1.8. Il a été fixé en 1.9. Les extraits ci-dessous sont exécutés avec ruby 1.9.3
Vous sont corrects,
food
à partir du bloc est associé à ce bloc, les ombres et les autres variables de ce nom. Mais si vous faites quelque chose de destructeur, il sera reflété dans le tableau d'origine, parce qu'il est fait référence à l'élément de tableau, pas sa copie. Observer:Le bloc hérite de la portée du contexte, il est défini. Jetez un oeil à cet exemple:
De sorte qu'il n'a pas d'importance où le proc/bloc est exécuté, mais plutôt où il a été défini.
Dans votre cas, la
food
variable à l'intérieur du bloc est en fait de l'ombre à lafood
tableau à partir de l'extérieur. Mais vous avez vraiment fonctionner sur les éléments réels (pas de doublons/clones) defood
tableau dans le pâté de maisons pour tous les changements seront reflétés à l'extérieur.La raison pour laquelle
food
tableau des changements dans"Wine"
chaîne après le bloc est terminé, c'est que le bloc opère dans le même champ d'application de lafood
tableau a été défini, de sorte qu'il écrase avec le dernier élément du tableau puisque c'est le dernier objet qui est affecté àfood
variable.Ce bogue a été corrigé dans Ruby 1.9
Je pense que si vous voulez utiliser une variable locale dans Ruby 1.8, essayez
lambda
(Désolé, je n'ai pas installer Ruby 1.8, ne peut donc pas tester, mais le travail en 1.9)