Строки изменчивы в Ruby? - PullRequest
       32

Строки изменчивы в Ruby?

31 голосов
/ 16 апреля 2011

Строки изменчивы в Ruby? Согласно документации делает

str = "hello"
str = str + " world"

создает новый строковый объект со значением "hello world", но когда мы делаем

str = "hello"
str << " world"

В нем не упоминается, что он создает новый объект, поэтому он мутирует объект str, который теперь будет иметь значение "hello world"?

Ответы [ 2 ]

65 голосов
/ 16 апреля 2011

Да, << мутирует тот же объект, а + создает новый. Демонстрация:

irb(main):011:0> str = "hello"
=> "hello"
irb(main):012:0> str.object_id
=> 22269036
irb(main):013:0> str << " world"
=> "hello world"
irb(main):014:0> str.object_id
=> 22269036
irb(main):015:0> str = str + " world"
=> "hello world world"
irb(main):016:0> str.object_id
=> 21462360
irb(main):017:0>
7 голосов
/ 17 апреля 2011

Просто для дополнения, одно следствие этой изменчивости приведено ниже:

ruby-1.9.2-p0 :001 > str = "foo"
 => "foo" 
ruby-1.9.2-p0 :002 > ref = str
 => "foo" 
ruby-1.9.2-p0 :003 > str = str + "bar"
 => "foobar" 
ruby-1.9.2-p0 :004 > str
 => "foobar" 
ruby-1.9.2-p0 :005 > ref
 => "foo" 

и

ruby-1.9.2-p0 :001 > str = "foo"
 => "foo" 
ruby-1.9.2-p0 :002 > ref = str
 => "foo" 
ruby-1.9.2-p0 :003 > str << "bar"
 => "foobar" 
ruby-1.9.2-p0 :004 > str
 => "foobar" 
ruby-1.9.2-p0 :005 > ref
 => "foobar" 

Таким образом, вы должны мудро выбирать методы, которые вы используете со строками, чтобыизбегайте неожиданного поведения.

Кроме того, если вы хотите, чтобы в вашем приложении было что-то неизменное и уникальное, вы должны использовать символы:

ruby-1.9.2-p0 :001 > "foo" == "foo"
 => true 
ruby-1.9.2-p0 :002 > "foo".object_id == "foo".object_id
 => false 
ruby-1.9.2-p0 :003 > :foo == :foo
 => true 
ruby-1.9.2-p0 :004 > :foo.object_id == :foo.object_id
 => true 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...