有没有一种简单的方法来测试对象是否是不可变的(数字,零)或不是(数组,哈希,对象)?换句话说,它可以被其他代码的副作用改变吗?
动机:我想创建一个版本化的值存储,但有些数据是数组.一些数组将存储自定义对象,我可以通过存储"in"属性并搜索它来反转关系.但我也希望能够存储符号数组,其他数组等.
我找到了一种效率低下的方法:
class Object
def primitive?
begin
self.dup
false
rescue TypeError
true
end
end
end
Run Code Online (Sandbox Code Playgroud)
Ruby 中没有原始对象。因此,这不能以直接的方式检测到。
您不能简单地使用 Marshal 或 YAML 作为您的版本存储吗?然后您将免费加载和保存所有对象类型。为什么要重新发明轮子?
我不知道你到底想要实现什么,但是查看 YAML 的源代码可能会很有趣,看看他们如何处理这个问题。Ruby YAML 编码实现只是实现to_yaml
所有相关类的方法。请参阅yaml/rubytypes.rb。