Новости | 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. Если удобно использовать оригинальный объект — сначала сделай копию. Иначе поиск ошибок будет тяжелым. :)