#function #reference #parameter-passing #tcl #procedure
#функция #ссылка #передача параметров #tcl #процедура
Вопрос:
Как передать аргумент по ссылке в процедуре TCL?
Посмотрите на следующий блок кода:
proc test{amp;a} {
set a 7
}
set b 5
test b
puts $b
Я ждал, что результат должен быть 7, но оказалось 5.
Что не так с этим кодом?
Комментарии:
1. Проверьте
upvar
команду.2. Этот код не выдал вам ошибку? неправильные # аргументы: должно быть «тело аргументов имени процедуры» , вам нужен пробел между именем процедуры и списком аргументов.
Ответ №1:
Хитрость заключается в том, чтобы использовать upvar
команду для сопоставления переменной с этим именем в области вызывающего объекта во внутреннюю область процедуры.
proc test {amp;a} {
# It's a good idea to use an explicit level of 1
upvar 1 ${amp;a} a
set a 7
}
Обычно я бы не называл переменную amp;a
, поскольку их неудобно использовать с $
синтаксисом. Я в основном предпочитаю использовать что-то вроде varName
, чтобы, когда кто-то читает ошибку с неправильными аргументами test
, они получали эту читаемую версию:
wrong # args: should be "test varName"