0

我有两个文件:main.tcl 和paths.tcl。
主.tcl:

set p "paths.tcl"
puts $p
if {[lindex $argv 0]} {
    source $::p
    puts $::techDir
}
namespace eval ::newWkSpace {
    source $::p
}
puts $::newWkSpace::techDir

路径.tcl:

set techDir ../tech

我做了两个试验:

$ tclsh main.tcl 0
paths.tcl
../tech
$ tclsh main.tcl 1
paths.tcl
../tech
can't read "::newWkSpace::techDir": no such variable
    while executing
"puts $::newWkSpace::techDir"
    (file "main.tcl" line 11)

有人可以解释这个错误,为什么它在第一次试验中没有发生?(使用 tcl 8.5)

4

1 回答 1

3

我想在你的第二个测试用例中,当 interetter 执行时

namespace eval ::newWkSpace {
    source $::p
}

来执行

set techDir ../tech

它注意到 ::techDir 存在,它分配给它并且没有打扰在 newWkSpace 命名空间中创建一个 techDir 变量。

出现的一个问题是,“你为什么要这样做?”。如果您真的想让它工作,请尝试在获取variable techDirpaths.tcl 之前在您的命名空间中添加一条语句,因此:

namespace eval newWkSpace {
    variable techDir;   #<<<<<<<<<<<
    source $::p
}

我希望真正了解Tcl的人会在一段时间内纠正我并给你一个正确的答案。

于 2013-06-06T16:56:57.837 回答