2009-03-17 5 views
1

Dans cet exemple, les noyaux sont lancés car les modifications que vous apportez à buggy_logger sont appliquées à la chaîne 'status' - tout comme si vous utilisiez une copie d'une référence à un objet -> lorsque vous modifiez la copie de la référence, la modification est appliquée à l'objet sous-jacent -> cette modification est, à son tour, reflétée dans toutes les autres références à l'objet. Donc, en d'autres termes, buggy_logger est un alias à l'objet 'status' sans utiliser spécifiquement le mot-clé alias? Est-ce exact? Ainsi, en rubis, vous venez de dire'buggy_logger' est-il une référence à la chaîne 'status' dans cet exemple Ruby?

b = a 

puis toutes les modifications apportées à la suite b sont également reflétés dans un. Ou est-ce seulement vrai parce que nous parlons de chaînes, qui sont mutables dans Ruby?

# example-4.rb 

status = "peace" 

buggy_logger = status 

print "Status: " 
print buggy_logger << "\n" # <- This insertion is the bug. 

def launch_nukes?(status) 
    unless status == 'peace' 
    return true 
    else 
    return false 
    end 
end 

print "Nukes Launched: #{launch_nukes?(status)}\n" 

# => Status: peace 
# => Nukes Launched: true 

Répondre

2

Oui, c'est parce que les chaînes sont des objets. Essayez

buggy_logger = status.dup 

Si vous voulez un objet distinct avec la même valeur initiale. En ce qui concerne votre question au sujet de alias Je soupçonne que vous ne comprenez pas correctement comment alias est utilisé dans le rubis; aliasaliasaliasalias il est utilisé sur des méthodes, pas des objets, et n'est pas lié à la mutabilité.

Notez également que la même sémantique aurait été appliquée avec n'importe quelle classe; si l'état avait été un tableau, un fichier, ou n'importe quoi d'autre (à condition qu'il ait un état modifiable utilisable comme enregistreur), vous auriez obtenu des résultats analogues.

Un avertissement à propos de dup cependant. Si votre objet fait référence à d'autres objets, la copie fera également référence aux objets mêmes objets. C'est bien une fois que vous commencez à y penser de la bonne façon, mais difficile jusqu'à ce moment.

+0

Oh, c'est trop cool - je ne savais pas qu'il y avait une méthode dup. Merci. –

+0

Ah, d'accord. Donc ce n'est pas seulement des ficelles. Merci encore. –

Questions connexes