使Ruby字符串不可变

时间:2012-06-21 23:30:18

标签: ruby string

需要在我的程序中使某些Ruby字符串成为不可变的。什么是最好的解决方案?在String类上写一个包装器?

freeze方法对我不起作用。我看到freeze不允许你解冻对象。

以下是我的情况:我有一个类将字符串传递给回调。该字符串恰好是类的实例变量,可能很大。我不希望回调修改它,但仍允许类随意修改它。

2 个答案:

答案 0 :(得分:10)

  

以下是我的情况:我有一个将字符串传递给a的类   打回来。

将字符串的副本传递给回调函数吗?

  

此字符串恰好是类的实例变量   并且可能很大。我不希望回调修改它,   但仍允许班级随意修改。

如果你担心字符串的大小,那么使用String#dup会有所帮助。它将创建一个具有不同object_id的新对象,但不会复制该字符串的内容,除非新字符串(或原始字符串)被修改。这称为“写入时复制”,在Seeing double: how Ruby shares string values中进行了描述。

答案 1 :(得分:2)

在字符串上调用#freeze。请参阅:http://ruby-doc.org/core-1.9.3/Object.html#method-i-freeze