Использование пространства имен /uplevel/global в TCL
У меня есть такой скрипт:
proc subProc1 { } {
puts $var1
}
proc subProc2 { } {
puts $var2
}
proc mainProc { args } {
# Define many variables
subProc1
subProc2
#etc.
}
Я хотел бы, чтобы subProc1 и subProc2 имели переменные, определенные в mainProc. Я могу передать их в качестве аргументов, но это много аргументов, я бы хотел этого избежать.
Я попытался использовать команду upvar, добавив эту строку для меня subProcs:
subProc1 { } {
upvar $var1 var1 $var2 var2 ;#etc
puts $var1
# etc.
}
Но у меня есть сообщение об ошибке "нет такой переменной", и не очень приятно иметь такую огромную строку
Я только что прочитал о пространстве имен, но я не совсем понимаю, как его использовать (плюс я не уверен, что понимаю концепцию, так что она действительно адаптирована к моему варианту использования?)
1 ответ
upvar
это правильный инструмент для этого. Другие команды могут быть эмулированы с upvar
,
Но вы делаете ошибку, как вы называете upvar
, Вы должны использовать имя переменной, а не ее значение (что приведет к ошибке "нет такой переменной").
upvar var1 var1 var2 var2 ;#...
Я бы подумал об использовании другого способа хранения данных, может быть, словарь или массив?
Это облегчит передачу переменных.