2011-12-20 7 views
33

は、次のコードを考えてみましょう:Rubyの文字列は変更可能ですか?

$ 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) 

を個々の文字が新しい文字列を作成するoをワット/変更することができるように思えます。ただし、文字列に追加すると、明らかに新しい文字列が作成されます。

Rubyの文字列は可変ですか? Ruby Stringに追加は

+2

ありがとうございました。 http://stackoverflow.com/questions/2608493/why-did-matz-choose-to-make-strings-mutable-by-default-in-ruby –

+0

@DaveNewton:それはいかに簡単かあなたがGoogle上で最初に起こっているSOの話題にはほとんど期待できるので、あなたの上でdupsを見つけるには? –

+4

'+'は連結しており、新しい文字列を返します。 '<<'はAppendingであり、指定された文字列オブジェクトに追加されます(新しいものを作成しません)。 – Chad

答えて

37

はい、Rubyの文字列は、Pythonとは異なり、変更可能です。

s += "hello"s"hello"を追加ではありません - まったく新しい文字列オブジェクトが作成されます。 「場所で」文字列に追加するには、のように、<<を使用:Rubyで

s = "hello" 
s << " world" 
s # hello world 
+3

Rubyでは 'a + = b'を' a = a + b'と考えるのは意味がありますか?それは 's + =" hello "'が新しい文字列を作る理由を明らかにするでしょう。 – emlai

+1

@tuple_catはい、そのように '+ ='が実装されているので、 '+'を再定義すると '+ ='が再定義されます。 – YoTengoUnLCD

8

+=ではない、それはあなたが

+3

+1。 http://www.rubyfleebie.com/appending-to-a-string/で説明したように、「+ =」は新しいStringインスタンスを作成し、それを左オブジェクトに割り当てます。一方、 '<< '新しい文字列を既存の左オブジェクトに直接追加します。 – ruakh

11
ruby-1.9.3-p0 :026 > s="foo" 
=> "foo" 
ruby-1.9.3-p0 :027 > s.object_id 
=> 70120944881780 
ruby-1.9.3-p0 :028 > s<<"bar" 
=> "foobar" 
ruby-1.9.3-p0 :029 > s.object_id 
=> 70120944881780 
ruby-1.9.3-p0 :031 > s+="xxx" 
=> "foobarxxx" 
ruby-1.9.3-p0 :032 > s.object_id 
=> 70120961479860 

はそう、文字列は変更可能ですが、+=オペレータが作成自体によって対処されますあなたの質問を<<する+=を変更した場合<<

そうです新しい文字列。 <<古いものを保持

6

文字列は変更可能ですが、あなたは凍結してそれを変更することができます。私はthis pull requestで作ることができるものから、

irb(main):001:0> s = "foo".freeze 
=> "foo" 
irb(main):002:0> s << "bar" 
RuntimeError: can't modify frozen String 
0

、それはすべての文字列不変ではなく、変更可能なようになります「魔法のコメント」を追加するのRuby 3.0で可能になります。

このコメントを明示的に追加する必要があるようだから、 "はデフォルトでの文字列可変ですか?依然としてyesですが、条件付きのyesの一種 - あなたのスクリプトに魔法のコメントを書いたかどうかによって異なります。

EDITは

私は決定的にルビー3.0内の文字列の一部タイプは、実際には、デフォルトで不変になると述べている。このbug/issue on Ruby-Lang.orgを指摘しました。

1

Rubyの文字列は可変です。しかし、+ではなく連結のために< <を使用する必要があります。
実際には、新しい文字列オブジェクトを作成するため、
+演算子(不変)という文字列を連結しています。
< <演算子(可変)同じオブジェクト内で変更されるためです。

関連する問題