红宝石中不可变的物体

时间:2014-03-21 04:09:38

标签: ruby immutability

任何人都可以在Ruby中列出不可变对象..

我看到Ruby - Immutable Objects这个,我知道如何将可变对象转换为不可变对象,但不清楚ruby中不可变对象。

1 个答案:

答案 0 :(得分:3)

根据我的经验,您有两种选择:

  • 积极freeze任何对象,这意味着深度冻结,您不仅要冻结主要对象,还要冻结任何包含的对象,以防止修改。
  • 对于不修改代码的某些部分中的对象应遵守规定。

第二种方法是大多数应用程序使用的方法,因为一旦冻结,就无法解冻某些东西。 Objective-C具有许多对象的可变和非可变变体,C ++有const可以阻止修改任何对象,但Ruby中没有这样的东西。

这很大程度上是因为Ruby方法可以自由地做任何他们想要的事情,而且约束方式很少。 reader方法可以修改对象的状态吗?是。你可能有充分的理由这样做,Ruby不会妨碍你。

如果您正在编写依赖于处于非更改状态的对象的代码,请复制,冻结并使用该代码进行参考。这可能会大大减慢您的应用程序的速度并使其复杂化,因此这是一种非常严厉的方法。

最好的方法是尽可能少地共享信息,为设计中只读的信息提供接口,并通过采用适当的锁定措施避免篡改特定情况之外的事物。