| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Sumo 23.02.2015 21:44
Объект в парсере — это специальная версия хеша. Синтаксическая конструкция $var[$obj $.field[...]] эквивалентна $obj.field[...] $var[$obj]. Возьми объект из переменной obj, добавь в него поле field со значением «...» и положи ссылку на него в var.@main[]
$h[
$.field1[one]
$.field2[two]
]
^method1[$h]
^method3[$h]
@method1[aHash]
...
^method2[$aHash
# Добавляем поле
$.newField1[four]
# Меняем существующее
$.field2[three]
]В этом коде есть проблема. Мы добавили поля в оригинальный объект. В переменной h, после вызова method1 будет новое поле newFiled1, а в поле field2 будет лежать строка «three». Программист очень удивиться, когда в методе method3 окажется хеш в котором field2 eq three. Ведь парой строк выше написано совсем иное.@main[]
$h[
$.field1[one]
$.field2[two]
]
^method1[$h]
^method3[$h]
@method1[aHash]
...
^method2[^hash::create[$aHash]
# Добавляем поле
$.newField1[four]
# Меняем существующее
$.field2[three]
]Вот тут все будет нормально. Мы сделали копию параметра, добавили в него поле и передали в method3. В переменной h лежит оригинальный объект.@method1[aHash] ... $aHash.newField1[...] $aHash.field[three] ^method2[$aHash]То сразу бы увидел, что я меняю оригинальный объект и надо бы сделать копию. Всегда помните, что объекты передаются по ссылкам, т.е. в параметрах метода приходит оригинальный объект. Методы не должны менять ничего, что в них пришло, а результат возвращать через result. Если удобно использовать оригинальный объект — сначала сделай копию. Иначе поиск ошибок будет тяжелым. :)