#tcl
#tcl
Вопрос:
Итак, я что-то тестирую, и у меня есть «тестовый» процесс, вот так:
proc test {arg} {
global state
puts "Your arg is: $arg"
set state 1
}
test somearg
vwait state
Из прочитанного о uplevel и upvar, есть ли способ, которым я могу обойтись без необходимости использовать global, и использовать любой из этих параметров, чтобы установить состояние в «1», а затем выйти из программы?
Ответ №1:
Да, за исключением того, что vwait
всегда использует глобальные переменные для ожидания (строго говоря, это разрешает имена переменных в глобальной области видимости; вы можете использовать другие пространства имен, если предоставите полные имена). Чего вы не можете сделать, так это дождаться локальной переменной (потому что события не могут видеть локальные переменные за пределами своего собственного стека вызовов). Возможно, это изменится в будущем, но, конечно, не сейчас.
Что касается вопроса о global
, все эти инструкции одинаковы по действию внутри процедуры:
global foo
variable ::foo
upvar #0 foo foo
upvar ::foo foo
namespace upvar :: foo foo
У вас также есть ошибка в вашем коде: вы устанавливаете состояние, прежде чем ждать его изменения. Это все равно не сработает, потому что сначала вам нужно подождать и установить состояние из какого-то события.
Комментарии:
1. Хорошо, это имеет смысл. Спасибо! Эта «ошибка» была опечаткой с моей стороны. Я не хотел вставлять это туда. Большое спасибо!
Ответ №2:
Вы просите о двух разных вещах. Во-первых, о переменной. Вы можете использовать upvar
вот так:
proc test {arg} {
upvar #0 state state
puts "Your arg is: $arg"
set state 1
}
Или, что проще, вы можете просто использовать точное имя пространства имен:
proc test {arg} {
puts "Your arg is: $arg"
set ::state 1
}
Вторая «половина» вашего вопроса — это какое-то странное использование vwait
. Я просто хочу указать, что ваш фрагмент кода не завершится, потому что вы ожидаете изменения переменной ‘state’, но нет события, которое когда-либо изменит состояние. Вы уже изменили его при вызове test
. Итак, если вы не настроили окно / кнопку или что-то еще, что может привести к изменению состояния state
, ваш скрипт зависнет.
Для этого стоит прочитать wiki и справочную страницу vwait
.
Комментарии:
1. У меня есть другая процедура, которую я использую для настройки сетевых устройств после открытия сеанса ssh. У меня есть инструкция «состояние ожидания», аналогичная той, которую я опубликовал выше. И в рамках процедуры я «устанавливаю состояние 1» после завершения настройки. Это работает без проблем. Мне просто любопытно узнать, почему мой приведенный выше пример не работает … но мне придется продолжать копать.