Передача аргумента с помощью ссылочной процедуры TCL

#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"