使用auto_path访问名称空间中的Tcl变量



假设我在子目录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]

最新更新