2010-11-20 9 views
7

En Ruby 1.9 se puede tener Fixnum, Float y Symbol valores que son no congelada o congelada:¿Cuál es el uso o efecto de congelar símbolos y números en 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] 

entiendo la utilidad de las cadenas de congelación, matrices, u otros tipos de datos mutables. Hasta donde yo sé, sin embargo, las instancias Fixnum, Symbol y Float son inmutables desde el principio. ¿Hay alguna razón para congelarlos (o cualquier otra razón que Ruby no se informaría como ya frozen?

Tenga en cuenta que en Ruby 2.0 Fixnum s y s Float tanto comienzan como congelado, mientras que Symbol s conservan el comportamiento descrito anteriormente Así que, lentamente, está "mejorando" :)

Respuesta

8

La respuesta es no. Esos tipos de datos son inmutables. No hay razón para congelar esos tipos de datos. La razón por la que Ruby no informa esos tipos de datos como congelados es porque el método obj.frozen? devuelve el estado de congelación del objeto y se establece en false inicialmente para tipos de datos inmutables. Llamar al obj.freeze configurará el estado freeze en true para ese objeto.

La conclusión es que llamar freeze en un tipo de datos inmutables establece el estado freeze del obj a true, pero no hace nada porque el objeto ya es inmutable.

Cuestiones relacionadas