4

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

freeze方法对我不起作用。我看到这freeze不会让你解冻对象。

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

4

2 回答 2

10

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

将字符串的副本传递给回调工作吗?

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

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

于 2012-06-21T23:57:03.430 回答
2

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

于 2012-06-21T23:32:38.223 回答