从导入的过程访问Tcl命名空间变量

时间:2014-06-11 19:06:34

标签: variables namespaces tcl

我对Tcl很新,我试图达到这样的目标:

namespace eval foo {
    namespace export bar
    proc bar {} {
        puts $bob
    }
}

namespace eval fred {
    namespace import foo::*
    variable bob ""
}

fred::bar

但是,我发现在foo的范围内调用了bar,因此它告诉我foo :: bob不存在。

我怎样才能让fred :: bar访问fred :: bob?

非常感谢!

1 个答案:

答案 0 :(得分:0)

基本问题是你为什么要这样做?

它不是通常与Tcl名称空间一起使用的样式。实际上即使namespace import也没有那么多使用。

这是一个非常脆弱的设计,使测试更加困难,并隐藏了proc bar的依赖关系。因此,尝试以这种方式做事可能是不好的风格。

你当然可以做类似的事情,但它往往变得怪异,需要一个特制的proc bar,这很有效,但是非常难看:

namespace eval foo {
    namespace export bar
    proc bar {} {
        if {[info level 0] eq [namespace origin [info level 0]]} {
           # called from our native namespace...
           puts "Oops."
        } else {
           set foreign_ns ::[namespace qualifiers [info level 0]]
           namespace upvar $foreign_ns bob bob
           puts $bob
        }
    }
}

namespace eval fred {
    namespace import ::foo::*
    variable bob "hello bob"
}

fred::bar

打印"你好bob"。

所以也许尝试用不同的问题来解释你真正想要用这种导入做什么,并且可能会有更有用的答案。