String#+
:: str + other_str → new_str
Concatenation - 返回一个包含other_str
连接到的新字符串str
。
String#<<
:: str << integer → str
: Append - 将给定对象连接到str
.
<<
不创建新对象,就像+
那样。
a = "str"
#=> "str"
a.object_id
#=> 14469636
b = a << "ing"
#=> "string"
a.object_id
#=> 14469636
b.object_id
#=> 14469636
a= "str"
#=> "str"
b = a + "ing"
#=> "string"
a.object_id
#=> 16666584
b.object_id
#=> 17528916
编辑
从你的评论中,明白了你的意思。见下文:
def m1 (x)
x << "4"
end
#=> nil
def m2 (x)
x = x + "4"
end
#=> nil
str="123"
#=> "123"
m2(str)
#=> "1234"
str
#=> "123"
当您在方法内部传递值时,此处str
没有更改m2()
,所有更改都根据上述调用在方法中进行。因此下面str
没有显示该更改。要查看更改,您必须按如下方式调用它。
str = m2(str)
#=> "1234"
str
#=> "1234"
或者
您可以执行以下操作:- 我传递了参考地址str
但没有传递值。
str = "abc"
#=> "abc"
str.object_id
#=> 16250484
ObjectSpace._id2ref(16250484)
#=> "abc"
def m1 (x)
ObjectSpace._id2ref(x) << "4"
end
#=> nil
m1(16250484)
#=> "abc4"
str
#=> "abc4"
希望它有意义:)
干杯!