Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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_Immutability_Mutable - Fatal编程技术网

Ruby中的字符串是可变的吗?

Ruby中的字符串是可变的吗?,ruby,string,immutability,mutable,Ruby,String,Immutability,Mutable,考虑以下代码: $ irb > s = "asd" > s.object_id # prints 2171223360 > s[0] = ?z # s is now "zsd" > s.object_id # prints 2171223360 (same as before) > s += "hello" # s is now "zsdhello" > s.object_id # prints 2171224560 (now it's

考虑以下代码:

$ irb
> s = "asd"
> s.object_id   # prints 2171223360
> s[0] = ?z     # s is now "zsd"
> s.object_id   # prints 2171223360 (same as before)
> s += "hello"  # s is now "zsdhello"
> s.object_id   # prints 2171224560 (now it's different)
似乎可以在不创建新字符串的情况下更改单个字符。但是,附加到字符串显然会创建一个新字符串

Ruby中的字符串是可变的吗?

附加在中的不是
+=
,而是
Ruby-1.9.3-p0:026>s=“foo”
=>“foo”
ruby-1.9.3-p0:027>s.object\u id
=> 70120944881780 
ruby-1.9.3-p0:028>s.object\u id
=> 70120944881780 
ruby-1.9.3-p0:031>s+=“xxx”
=>“foobarxxx”
ruby-1.9.3-p0:032>s.object\u id
=> 70120961479860 

因此,字符串是可变的,但是
+=
操作符会创建一个新字符串<代码>是的,Ruby中的字符串与Python中的不同,是可变的


s+=“hello”
不是
s
中添加
“hello”
——创建一个全新的字符串对象。要“就地”附加到字符串,请使用Ruby中的字符串是可变的,但您可以通过冻结来更改它

irb(main):001:0> s = "foo".freeze
=> "foo"
irb(main):002:0> s << "bar"
RuntimeError: can't modify frozen String
irb(main):001:0>s=“foo”。冻结
=>“foo”
irb(main):002:0>s据我所知,在Ruby 3.0中添加一个“神奇注释”将使所有字符串都不可变,而不是可变

因为您似乎必须显式地添加此注释,所以“字符串是否默认可更改?”的答案似乎仍然是肯定的,但有一种条件是肯定的,这取决于您是否将神奇的注释写入脚本

编辑


有人指出,Ruby 3.0中某些类型的字符串在默认情况下是不可变的。

Ruby字符串是可变的。但您需要使用Yes,并通过琐碎的搜索来回答@DaveNewton:在google上找到DUP是多么容易,以至于你几乎可以指望google上第一个出现的SO主题,这不是很好吗?
+
正在连接并将返回一个新字符串<代码>@EdS.是和否;是的,因为它已经被回答了,不是的,因为它意味着人们宁愿问一个问题,也不愿做少量的研究。
s+=“hello”
s=s+“hello”
的缩写,它运行
String++
方法,该方法总是返回一个新字符串。+1。正如在中所解释的,“
+=
将创建一个新的字符串实例并将其分配给您的左对象。另一方面,
a+=b
视为Ruby中的
a=a+b
有意义吗?这将清楚为什么
s+=”您好
创建一个新字符串。@tuple\u cat Yes,这就是
+=
的实现方式,因此重新定义
+
会产生一个重新定义的
+=
s = "hello"
s << "   world"
s # hello world
irb(main):001:0> s = "foo".freeze
=> "foo"
irb(main):002:0> s << "bar"
RuntimeError: can't modify frozen String