Идея изменчивости на самом деле не применяется в Ruby так же, как в других языках. Единственный неизменный объект - замороженный. Вы даже можете добавить методы и переменные экземпляра в Fixnums. Например:
class Fixnum
attr_accessor :name
end
1.name = "one"
2.name = "two"
Очевидно, что в подавляющем большинстве случаев люди не будут достаточно патологичны для добавления атрибутов в Fixnum, но дело в том, что незамерзающий объект не является действительно неизменным.
Если вы можете придумать канонический список классов, которые вы хотите считать неизменяемыми, вы можете просто пройти и дать им всем метод immutable?()
, который возвращает true (и Object версию, которая возвращает false). Но, как сказал Вванберген, лучший способ убедиться, что ваша копия объекта не изменилась, - это глубоко скопировать ее с Маршалом.