parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Тоже попробую пробить дно доступности :)

andylars 05.07.2017 11:57 / 05.07.2017 12:03

Я как раз не могу найти объяснения, что есть *args
Во-первых, это такой специальный синтаксис языка, (*имя_переменной), используемый только для работы с набором входящих параметров для метода (функции, процедуры). И позволяющий реализовать приём произвольного кол-ва параметров.

Во-вторых, имя args - не зарезервированное для синтаксиса, это просто произвольное название перменной, которая при наличии звёздочки впереди - автоматически превратится в перменную с типом (классом) хеш (hash).

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