我有两个文件:main.tcl和paths.tcl。
main.tcl:
set p "paths.tcl"
puts $p
if {[lindex $argv 0]} {
source $::p
puts $::techDir
}
namespace eval ::newWkSpace {
source $::p
}
puts $::newWkSpace::techDir
paths.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)
答案 0 :(得分:3)
我想在你的第二个测试案例中,当intertter执行时
namespace eval ::newWkSpace {
source $::p
}
然后来执行
set techDir ../tech
它注意到:: techDir已存在,它被分配到那里并且没有在newWkSpace命名空间中创建一个techDir变量。
出现的问题是,"你为什么这样做?"。如果你真的想让它工作,那么在你输出paths.tcl之前尝试在你的命名空间中加一个variable techDir
语句,这样:
namespace eval newWkSpace {
variable techDir; #<<<<<<<<<<<
source $::p
}
我希望那些真正了解Tcl的人会在一段时间内让我正确并给你一个正确的答案。