假设我在子目录folder
中有一个Tcl文件foo.tcl
:
namespace eval foo {
variable bar; array set bar {x 1}
proc baz {x} {
puts $x
}
}
运行auto_mkindex
生成tclIndex
文件,行为
set auto_index(::foo::baz) [list source [file join $dir foo.tcl]]
当我在另一个文件中使用该命名空间时,它无法访问bar
变量
lappend auto_path folder
puts $::foo::bar(x)
$ tclsh c.tcl
can't read "::foo::bar(x)": no such variable
while executing
"puts $::foo::bar(x)"
(file "c.tcl" line 5)
但是当我首先调用baz
时,它运行得很好。
lappend auto_path folder
::foo::baz
puts $::foo::bar(x)
$ tclsh a.tcl
5
1
给了什么?
自动加载器只在缺少命令时触发,而不是缺少变量时触发。有一个钩子用于处理丢失的命令(通常称为unknown
),但没有钩子用于处理丢失的变量。
最简单的修复方法是创建一个foo::bar
命令,它只返回变量的值,并将变量本身视为其他地方名称空间的内部实现细节。可以自动加载:
namespace eval foo {
variable bar; array set bar {x 1}
proc bar {x} {
variable bar
return $bar($x)
}
}
puts [foo::bar x]