class MyClass
attr_reader :attr1, :attr2
def initialize(attr1, attr2)
@attr1 = attr1
@attr2 = attr2
end
def some_method
"Attr1: #{@attr1}, Attr2: #{@attr2}"
end
end
# 创建实例并冻结
obj = MyClass.new('value1', 'value2')
obj.freeze
# 使用示例
puts obj.some_method
# 以下尝试修改属性会报错
# obj.attr1 = 'new_value1' # 会报错: can't modify frozen MyClass
可能遇到的陷阱
- 可变内部对象:如果类的属性是可变对象(如数组、哈希),即使对象本身被冻结,内部的可变对象仍可被修改。例如:
class InnerMutableClass
attr_reader :mutable_array
def initialize
@mutable_array = [1, 2, 3]
end
end
inner_obj = InnerMutableClass.new
inner_obj.freeze
inner_obj.mutable_array << 4 # 不会报错,数组仍可修改
- 方法中的修改:如果类的方法中修改了对象的状态,即使对象被冻结,该方法调用时仍会尝试修改,可能导致错误或不符合预期的行为。
- 继承与方法重写:如果子类重写了父类方法,且重写后的方法修改了对象状态,即使父类对象冻结,子类对象调用该方法时仍可能修改状态。