0

main.tcl と paths.tcl の 2 つのファイルがあります。
main.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

そして、私は2つの試行を行います:

$ 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

あなたの2番目のテストケースでは、interetterが実行されたときだと思います

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

そして実行に来た

set techDir ../tech

::techDir が存在することに気付き、それに割り当てられ、newWkSpace 名前空間に techDir 変数を作成する必要はありませんでした。

「どうしてこんなことをするの?」という疑問が湧いてきます。variable techDir本当に動作させたい場合は、paths.tcl をソースする前に名前空間にステートメントを入れてみてください。

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

Tcl を本当に理解している誰かが、私の正しさを正し、適切な回答をしてくれることを期待しています。

于 2013-06-06T16:56:57.837 に答える