我有以下代码:
proc testList {setupFile ""} {
if {$setupFile == ""} {
set setupFile location
}
}
proc run {} {
puts "$setupFile"
}
我收到语法错误。我知道如果我在proc之外声明setupFile变量,即在主proc中,那么我可以使用命名空间附加说明:: 65WL :: setupFile使其成为全局但如果变量本身在proc中定义则不知道怎么做仅
答案 0 :(得分:12)
您可以使用::
引用全局命名空间。
proc testList {{local_setupFile location}} {
# the default value is set in the arguments list.
set ::setupFile $local_setupFile
}
proc run {} {
puts $::setupFile
}
答案 1 :(得分:4)
特定过程运行不是本地的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"
}
现在,这是用于共享完整变量的。如果您只想共享一个值,还有其他一些替代方案。例如,这两种可能性:
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"
}]
}
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
}
Tcl 8.6有更多选项,但仍处于测试阶段。
答案 2 :(得分:1)
你可以使用uplevel,upvar和/或global
proc testList {{setupFile ""}} {
if {$setupFile eq ""} {
set setupFile location;
uplevel set setupFile $setupFile;
}
}
proc run {} {
upvar setupFile setupFile;
puts "$setupFile";
}
或
proc run {} {
global setupFile;
puts "$setupFile";
}
第一个是首选。