Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使Ruby字符串不可变_Ruby_String - Fatal编程技术网

使Ruby字符串不可变

使Ruby字符串不可变,ruby,string,Ruby,String,需要使程序中的某些Ruby字符串不可变。最好的解决方案是什么?在String类上编写包装器 freeze方法对我不起作用。我看到freeze不允许您解冻对象 下面是我的情况:我有一个类将字符串传递给回调。该字符串恰好是该类的实例变量,可能很大。我不希望回调修改它,但仍然允许类随意修改它。对字符串调用#冻结。见: 下面是我的情况:我有一个类将字符串传递给 回拨 将字符串的副本传递给回调是否有效 此字符串恰好是该类的实例变量 而且可能很大。我不想回调修改它, 但是仍然允许类随意修改它 如果您担心字符

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

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

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

对字符串调用
#冻结
。见:

下面是我的情况:我有一个类将字符串传递给 回拨

将字符串的副本传递给回调是否有效

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


如果您担心字符串的大小,那么使用string#dup会有所帮助。它将创建一个新对象,该对象具有不同的
对象id
,但除非修改新字符串(或原始字符串),否则不会复制该字符串的内容。这称为“写下时复制”,如中所述。

谢谢,但这在我的情况下不起作用。请参阅对我的原始帖子的编辑。对这个答案+1,因为复制冻结的字符串总是可能的,结果将是一个可变的副本。听起来你不想使字符串不可变,而是想限制它的变异能力。@zettetic:同意。这正是我想要的。使用
dup
听起来很完美。我不想修改base
String
类,因为它可能会给以后的调试带来麻烦。谢谢。String#dup非常适合上述场景。