Какая польза или эффект от замораживания символов и чисел в Ruby? - PullRequest
15 голосов
/ 21 ноября 2010

В Ruby 1.9 вы можете иметь значения Fixnum, Float и Symbol, которые не заморожены или заморожены:

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]

Я понимаю полезность замораживания строк, массивов или других изменяемых типов данных. Однако, насколько я знаю, экземпляры Fixnum, Symbol и Float являются неизменными с самого начала. Есть ли какая-либо причина, чтобы заморозить их (или любая причина, по которой Руби не сообщит о них как о frozen?

Обратите внимание, что в Ruby 2.0 Fixnum s и Float s оба начинаются как замороженные, тогда как Symbol s сохраняют поведение, описанное выше. Итак, постепенно становится «лучше»:)

1 Ответ

15 голосов
/ 21 ноября 2010

Ответ - нет. Эти типы данных являются неизменными. Нет причин заморозить эти типы данных. Причина, по которой Ruby не сообщает эти типы данных как замороженные, заключается в том, что метод obj.frozen? возвращает состояние замораживания объекта, и для него изначально установлено значение false для неизменяемых типов данных. Вызов obj.freeze установит для этого объекта статус freeze на true.

Суть в том, что вызов freeze для неизменяемого типа данных устанавливает freeze статус объекта для true, но ничего не делает, потому что объект уже неизменен.

...