| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
andylars 05.07.2017 11:57 / 05.07.2017 12:03
Я как раз не могу найти объяснения, что есть *argsВо-первых, это такой специальный синтаксис языка, (*имя_переменной), используемый только для работы с набором входящих параметров для метода (функции, процедуры). И позволяющий реализовать приём произвольного кол-ва параметров.
^method_one[A] ^rem{# выдаст Answer = A }
^method_one[A;B] ^rem{# выдаст ошибку, т.к. числе передаваемых параметров больше, чем умеет принимать метод }
^method_two[A;B;C;;;;D;E;F] ^rem{# выдаст Answer = A = B = C = = = = D = E = F т.е. можно вызвать метод с любым кол-вом параметров, и даже пропуская }
@method_one[some_param]
# some_param - имеет тип строка (string), т.к. мы получили строку
Answer = $some_param
@method_two[*some_param] ^rem{# <-- подсветка кода сломалась, это баг форума, не обращайте внимание }
# благодаря синтаксису *var
# some_param - автоматически становится типом хеш,
# а все переданные в вызове параметра кладутся, как записи (ключи-значения) этого хеша
# метод foreach - перебирает последовательно записи внутри хеша
Answer ^some_param.foreach[k;v]{ = $v }
#----- Другой способ --------------
# Существуют и другой, популярный способ вызова методов
# с произвольным набором параметров (хотя и чуть более прожорливый по памяти)
# в тело передачи параметров отдаем хеш, с ключами A,B,C и их значениями
# метод сам решает какие параметры ему знакомы (по имени), а какие он
# игнорирует (всё на воле автора метода)
^method_three[ $.B[Banana] $.A[Apple] $.C[Cholorine] ] ^rem{# выдаст Answer = Apple = Banana }
@method_three[some_param]
# пересоздадим хеш, на случай вызова нашего метода
# с пустым набором параметров, или не в формате хеша
$some_param[^hash::create[$some_param]]
Answer
= $some_param.A ^rem{ Apple }
= $some_param.B ^rem{ Banana }
# теперь вместо привязки параметров к порядку следования (1,2...)
# у нас - именованные параметры, порядок задания которых,
# как мы видим, значения не имеет
# мы можем принять любое кол-во параметров с любыми названиями (ключами)
# и работать с теми, которые метод ожидает и умеет обрабатыватьНе знаю, вышло ли понятнее :)