MST

星途 面试题库

面试题:Ruby不可变对象:自定义类的冻结行为

定义一个自定义Ruby类`MyClass`,其中包含一些属性和方法。如何使这个类的实例对象成为不可变的,即调用`freeze`后,对象的所有属性和相关状态都不能被修改?展示完整的类定义以及冻结后的使用示例,并说明在这种情况下可能遇到的陷阱。
31.5万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试
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

可能遇到的陷阱

  1. 可变内部对象:如果类的属性是可变对象(如数组、哈希),即使对象本身被冻结,内部的可变对象仍可被修改。例如:
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 # 不会报错,数组仍可修改
  1. 方法中的修改:如果类的方法中修改了对象的状态,即使对象被冻结,该方法调用时仍会尝试修改,可能导致错误或不符合预期的行为。
  2. 继承与方法重写:如果子类重写了父类方法,且重写后的方法修改了对象状态,即使父类对象冻结,子类对象调用该方法时仍可能修改状态。