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