Уроки Tcl
#12: Варианты аргументов процедур и возвращаемых значений |
Процедуры могут быть определены с заданным числом атрибутов (как команда sum в предыдущем примере), или могут иметь произвольное количество аргументов. Так же для аргументов может быть заданы значения по умолчанию.
Аргументом так же может быть список. Это делается заключением двух слов в фигурных скобках. Когда интерпретатор Tcl встречает такую конструкцию, он воспринимает первое слово как имя переменной, а второе слово - как значение по умолчанию. Если процедура вызвается без данного аргумента, то переменной присваивается значение по умолчанию.
Процедуры могут быть определены так, чтобы принимать любое число аргументов, для этого используется аргумент args. Если последний аргумент списка args, то все аргументы, которые не были переданы в переменные будут присвоены args.
В примере процедура example определена с тремя аргументами. При вызове один аргумент должен быть задан. Второй аргумент может быть опущен, в этом случае переменной присвоится значение по умолчанию. Задание последнего аргумента как args позволяет процедуре example получать любое количество аргументов.
Помните, что если есть переменные (кроме args) после переменной с заданным значением по умолчанию, то значение по умолчанию никогда не будет использовано. Например как в следующей процедуре:
proc function { a {b 1} c} {...}
Tcl присвоит значения переменным процедуры в порядке, каком они перечислены в команде. Если вы зададите два аргумента, то при вызове function они будут присвоены переменным a и b, и Tcl сообщит об ошибке, так как значение c будет неопределено.
Однако вы можете использовать args после аргументов со значениями по умолчанию.
proc example {required {default1 А} {default2 Б} args} {...}
В этом случае example требует один аргумент, который будет присвоен переменной required. Если присутствуют два аргумента, то второй будет присвоен переменной default1, переменой default2 присвоится значение Б, а переменной args - пустая строка. Если задано больше трёх аргументов - то все аргументы после третье присвоятся в args.
Как видите в примере, с переменной args процедура example может быть вызвана с одним, двумя или более аргументами. Выполните пример, проанализируйте результат и переходите к следующему упражнению.
proc example {first {second ""} args} { if {$second == ""} { puts "Задан только один аргумент, он равен: $first"; return 1; } else { if {$args == ""} { puts "Два аргумента - $first и $second"; return 2; } else { puts "Несколько аргументов - $first, $second и $args"; return "несколько"; } } } set count1 [example ОДИН] set count2 [example ОДИН ДВА] set count3 [example ОДИН ДВА ТРИ] set count4 [example ОДИН ДВА ТРИ ЧЕТЫРЕ] puts "Процедура example была вызвана с $count1, $count2, $count3, $count4 аргументами" |
Горбачев "Yurez" Юрий |