1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

String#to_s は同一のオブジェクトを返す

Last updated at Posted at 2015-10-26

個人的に気になって調べた点のメモです。
仕様化されているかはまだ調べていないものの、少なくとも Ruby 2.2.3 はこの挙動でした。

結論

String#to_s は同一のオブジェクトを返す (タイトル通り)

問題になるケース

たとえば以下のようなコード

query = str.dup
result = foo query

ここまで書いて strnil になり得ることがわかったので、 .to_s しようとなったときに、それが新たな String オブジェクトを返すなら .dup はいらないことになるし、そうでなければ残す必要がある。
(もちろん、str をあとで使わなければ問題ない話なんだけど、それを完璧に保証するのは難しいので、変なバグを避けるために)

検証コード

a = 'foo'
b = a.to_s

p a.__id__ == b.__id__
# => true

a.upcase!

p [a, b]
# => ["FOO", "FOO"]

このように、.to_s しただけでは同一のオブジェクトがそのまま変わるので、元の変数 a に破壊的変更を行うと b にも影響してしまう。

.dup すればそういった問題は避けられる。

a = 'foo'
b = a.to_s.dup

p a.__id__ == b.__id__
# => false

a.upcase!

p [a, b]
# => ["FOO", "foo"]

あとで覚えてたら rubyspec とかも見てみる。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?