Строки в 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 изменяются?
Ответы
Ответ 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 на самом деле по умолчанию будет неизменным.