Подтвердить что ты не робот

Строки в 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 different)

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

Строки в Ruby изменяются?

4b9b3361

Ответ 1

Да, строки в Ruby, в отличие от Python, изменяемы.

s += "hello" не добавляет "hello" в s - создается совершенно новый объект строки. Чтобы добавить к строке "на месте", используйте <<, например:

s = "hello"
s << "   world"
s # hello world

Ответ 2

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 

Таким образом, строки изменяемы, но оператор += создает новую строку. << хранит старый

Ответ 3

Добавление в Ruby String не +=, это <<

Итак, если вы измените += на <<, ваш вопрос будет сам адресован

Ответ 4

Строки в Ruby изменяемы, но вы можете изменить их с помощью замораживания.

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

Ответ 5

Ruby Strings являются изменяемыми. Но вам нужно использовать < < для конкатенации, а не+.
На самом деле конкатенация строки с помощью   + оператор (неизменный), поскольку он создает новый строковый объект.
  < < оператор (изменяемый), потому что он изменяется в одном и том же объекте.

Ответ 6

Из того, что я могу сделать этот запрос на растяжение, в Ruby 3.0 станет возможным добавить "волшебный комментарий", который сделает все string неизменяемый, а не изменяемый.

Поскольку кажется, что вы должны явно добавить этот комментарий, кажется, что ответ на "по умолчанию изменен по-умолчанию"? все равно будет да, но какое-то условное да - зависит от того, написали ли вы волшебный комментарий в своем script или нет.

ИЗМЕНИТЬ

Я указал на эту ошибку на Ruby-Lang.org, которая окончательно заявляет, что какой-то тип строк в Ruby 3.0 на самом деле по умолчанию будет неизменным.