我有以下代码:
proc testList {setupFile ""} {
if {$setupFile == ""} {
set setupFile location
}
}
proc run {} {
puts "$setupFile"
}
Run Code Online (Sandbox Code Playgroud)
我收到语法错误.我知道如果我在proc之外声明setupFile变量,即在主proc中,那么我可以使用命名空间附加说明:: 65WL :: setupFile使其成为全局但如果变量本身在proc中定义则不知道怎么做只要.
gle*_*man 13
您可以使用引用全局命名空间::
.
proc testList {{local_setupFile location}} {
# the default value is set in the arguments list.
set ::setupFile $local_setupFile
}
proc run {} {
puts $::setupFile
}
Run Code Online (Sandbox Code Playgroud)
对于特定过程运行来说不是本地的 Tcl 变量需要绑定到命名空间;命名空间可以是全局命名空间(有一个特殊的命令),但不一定是。因此,要在两个过程之间共享一个变量,您需要给它一个公开的名称:
proc testList {{setup_file ""}} {
# Use the 'eq' operator; more efficient for string equality
if {$setup_file eq ""} {
set setup_file location
}
global setupFile
set setupFile $setup_file
}
proc run {} {
global setupFile
puts "$setupFile"
}
Run Code Online (Sandbox Code Playgroud)
现在,这是为了共享一个完整的变量。如果您只想共享一个值,还有其他一些选择。例如,这两种可能性:
proc testList {{setup_file ""}} {
if {$setup_file eq ""} {
set setup_file location
}
# Create a procedure body at run-time
proc run {} [concat [list set setupFile $setup_file] \; {
puts "$setupFile"
}]
}
Run Code Online (Sandbox Code Playgroud)
proc testList {{setup_file ""}} {
if {$setup_file eq ""} {
set setup_file location
}
# Set the value through combined use of aliases and a lambda term
interp alias {} run {} apply {setupFile {
puts "$setupFile"
}} $setup_file
}
Run Code Online (Sandbox Code Playgroud)
Tcl 8.6 有更多选项,但仍处于测试阶段。