пространство имен с переменной переменной - PullRequest
0 голосов
/ 24 мая 2019

Я бы создал пространство имен с именами переменных вроде:

proc show {} {
    puts $fg::varName
    puts $fg::x
}
set p "varName"
namespace eval fg {variable $p FirstValue}
namespace eval fg {variable x "Second variable"}
show

Это работает, я думаю, потому что это вне процедуры. Если я изменю код:

proc show {} {
    puts $fg::varName
    puts $fg::x
}
# set p ""
proc xx {} {
#   global p
    set p "varName"
    namespace eval fg {variable $p FirstValue}
    namespace eval fg {variable x "Second variable"}
    show
}
xx

Я получаю ошибку, т. Е. не могу прочитать "p": такой переменной нет . Это работает, если я раскомментирую set p "" и global p но это кажется немного громоздким.

1 Ответ

2 голосов
/ 24 мая 2019

Когда вы делаете:

namespace eval fg {variable $p FirstValue}

Код в скобках вычисляется в указанном пространстве имен (там также доступны глобальные переменные пространства имен), а переменная $ p является локальной для процедуры "xx".

В качестве обходного пути вы можете передать код «предварительно оцененный».Например:

namespace eval fg [list variable $p FirstValue]
...