如何测试Ruby对象是否不可变?

Jus*_*ove 5 ruby immutability

有没有一种简单的方法来测试对象是否是不可变的(数字,零)或不是(数组,哈希,对象)?换句话说,它可以被其他代码的副作用改变吗?

动机:我想创建一个版本化的值存储,但有些数据是数组.一些数组将存储自定义对象,我可以通过存储"in"属性并搜索它来反转关系.但我也希望能够存储符号数组,其他数组等.

Jus*_*ove 6

我找到了一种效率低下的方法:

class Object
  def primitive?
    begin
      self.dup
      false
    rescue TypeError
      true
    end
  end
end
Run Code Online (Sandbox Code Playgroud)


wva*_*gen 4

Ruby 中没有原始对象。因此,这不能以直接的方式检测到。

您不能简单地使用 Marshal 或 YAML 作为您的版本存储吗?然后您将免费加载和保存所有对象类型。为什么要重新发明轮子?

我不知道你到底想要实现什么,但是查看 YAML 的源代码可能会很有趣,看看他们如何处理这个问题。Ruby YAML 编码实现只是实现to_yaml所有相关类的方法。请参阅yaml/rubytypes.rb