2010-11-20 17 views
7

Dans Ruby 1.9, vous pouvez avoir Fixnum, Float et Symbol valeurs qui sont dégelés ou congelés:Quelle est l'utilisation ou l'effet de la congélation de symboles et de nombres dans Ruby?

irb(main):001:0> a = [ 17, 42.0, :foo ]; a.map(&:frozen?) 
=> [false, false, false] 

irb(main):002:0> a.each(&:freeze); a.map(&:frozen?) 
=> [true, true, true] 

Je comprends l'utilité des chaînes de congélation, des tableaux ou d'autres types de données mutables. Pour autant que je sache, cependant, Fixnum, Symbol, et Float instances sont immuables depuis le début. Y at-il raison de les congeler (ou toute autre raison que Ruby ne leur rapport comme déjà frozen?

Notez que dans Ruby 2.0 Fixnum s et Float s les deux commencent comme gelé, alors que Symbol s conservent le comportement décrit ci-dessus Alors, ça devient lentement "meilleur" :)

Répondre

8

La réponse est non. Ces types de données sont immuables. Il n'y a aucune raison de geler ces types de données. La raison pour laquelle Ruby ne signale pas que ces types de données sont gelés est que la méthode obj.frozen? renvoie l'état de blocage de l'objet et qu'elle est définie sur false initialement pour les types de données immuables. L'appel obj.freeze définira l'état freeze sur true pour cet objet.

L'essentiel est que l'appel freeze sur un type de données immuable définit l'état freeze du obj à true, mais ne fait rien parce que l'objet est déjà immuable.