Новости | 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...) # у нас - именованные параметры, порядок задания которых, # как мы видим, значения не имеет # мы можем принять любое кол-во параметров с любыми названиями (ключами) # и работать с теми, которые метод ожидает и умеет обрабатыватьНе знаю, вышло ли понятнее :)