Почему мой объект неожиданно изменился?
чт, 02/08/2007 - 20:11 — spine
A = a = b = "abc"
b.concat("d")
puts a #=> "abcd"
puts A #=> "abcd"
Переменные содержат ссылки на объекты. Присваивание A = a = b = "abc" присваивает переменным A, a и b ссылку на объект "abc".
В строке b.concat("d") был вызван метод concat, который изменил объект, и вместо "abc" он стал "abcd". Так как A и a также указывают на этот объект, возвращаемое ими значение тоже изменилось.
На практике это не такая уж и проблема, как кажется сперва.
В дополнение к этому, начиная с Ruby 1.5.2, все объекты могут быть заморожены (frozen), защищая их от изменений.
