我对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?
非常感谢!
答案 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"。
所以也许尝试用不同的问题来解释你真正想要用这种导入做什么,并且可能会有更有用的答案。