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

Accessing Tcl variables in namespaces when using auto_path

假设我在子目录 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 命令,仅 returns 变量的值,并将变量本身视为别处命名空间的内部实现细节。 可以自动加载:

namespace eval foo {
    variable bar; array set bar {x 1}

    proc bar {x} {
        variable bar
        return $bar($x)
    }
}
puts [foo::bar x]