2010-11-20 3 views
7

In Ruby 1.9 können Sie Fixnum, haben Float und Symbol Werte, die nicht gefrorenen oder gefroren sind:Was ist die Verwendung oder der Effekt des Einfrierens von Symbolen und Zahlen in 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] 

ich die Nützlichkeit von Einfrieren Strings verstehen, Arrays oder andere veränderbare Datentypen. Soweit ich weiß, Fixnum, Symbol und Float Instanzen sind jedoch von Anfang an unveränderlich. Gibt es einen Grund, sie (oder aus irgendeinem Grunde zu gefrieren, dass Ruby nicht als bereits frozen?

Hinweis berichten würde, dass in Ruby 2.0 Fixnum s und Float s sowohl als gefroren beginnen, während Symbol s behält das oben beschriebene Verhalten So, es wird langsam "besser" :)

Antwort

8

Die Antwort ist nein. Diese Datentypen sind unveränderbar. Es gibt keinen Grund diese Datentypen einzufrieren. Der Grund, warum Ruby diese Datentypen nicht als eingefroren meldet, liegt daran, dass die Methode obj.frozen? den Status des Einfrierens des Objekts zurückgibt und für unveränderliche Datentypen anfänglich auf false gesetzt ist. Durch Aufruf von obj.freeze wird der freeze-Status für dieses Objekt auf true gesetzt.

Unterm Strich ist, dass freeze auf einem unveränderlichen Datentyp Aufruf setzt den freeze Status des obj zu true, tut aber nichts, weil das Objekt bereits unveränderlich ist.

Verwandte Themen