Это потому, что в Ruby
x = y
это всегда присвоение значения, полученного в результате y
, переменной x
, в то время как
obj.x = y
- это всегда отправка x=
сообщения объекту obj
(со значением, полученным из y
).
В Ruby атрибуты / свойства на самом деле просто методы!Таким образом, попробуйте:
self.attr1 = 'new 1 value'
self.attr2 = 'new 2 value'
С другой стороны, y
может быть или не быть вызовом метода (читай: property fetch).Это зависит от того, существует ли уже переменная y
в области видимости или нет, потому что переменные shadow методы.Вот почему attr1
и attr2
работают в to_s
без префикса.
Счастливого кодирования.