String#+
:: Concatenation - に連結されstr + other_str → new_str
た新しい文字列を返します。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"
method 内で値を渡しても、ここで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"
それが理にかなっていることを願っています:)
乾杯!