关于Tcl命名空间的问题
我有两个关于 Tcl 中的命名空间的问题。
namespace eval ::dai {
set a 5
set b 10
namespace export *
}
我的问题是:
export *
- 导出将使此命名空间内的某些变量可以在其他命名空间中使用,但是这个export *
是什么意思? p>设置一个5,我们不应该使用
变量a 5
吗?它们是一样的吗?有些教程说在命名空间内,我们应该使用variable
,命名空间中的variable
和set
有什么区别?
I have two question about namespace in Tcl.
namespace eval ::dai {
set a 5
set b 10
namespace export *
}
My questions are:
export *
- the export will make some variable inside this namespace can be used in other namespace, but what does thisexport *
mean?Set a 5, should not we use
variable a 5
? are they the same? some tutorials say inside namespace, we should usevariable
, what is the difference betweenvariable
andset
in namespace?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
1) 对于 Unix 用户来说,“*”是(应该是)合乎逻辑的,意味着“当前可用的一切”。就像当您在 shell 中执行 rm -f * 时,shell 会展开“*”并将其替换为当前目录中存在的所有文件的列表。实际上,正如
namespace
手册所述 您可以指定比简单的“*”更复杂的模式。要了解那里提到的“glob-style”意味着什么,请阅读字符串匹配
。2)“我们不应该使用...”这个问题是不正确的,因为这取决于你想做什么。如果要声明位于命名空间中的变量,请使用
variable
。如果你想设置一个变量,请使用set
,但要注意,如果该变量x
尚不存在于命名空间中,Tcl将尝试使用此查找全局变量名称,请参阅:“名称解析”中对此进行了解释
命名空间
手册页的部分。请注意,此行为可能看起来不合逻辑,但它实际上与过程范围匹配:如果您在过程主体中执行
set foo bar
,这意味着设置本地变量,除非您另外声明使用global
或variable
或使用完全限定名称(如::ns::foo
)。1) As is (supposed to be) logical for Unix users, "*" means "everything available at the moment". It's like when you do
rm -f *
in a shell, the shell expands "*" and replaces it with a list of all the files present in the current directory. Actually, asnamespace
manual states you can specify more elaborate patters than simple "*". To learn what that "glob-style" thing mentioned there means read aboutstring match
.2) The question "should not we use..." is incorrect because it depends on what you want to do. If you want to declare a variable located in the namespace, use
variable
. If you want to set a variable, useset
, but bevare that if that variablex
is not exist in the namespace yet, Tcl will attempt to find a global variablte with this name, see:This is explained in the "NAME RESOLUTION" section of the
namespace
man page.Note that this behaviour may appear illogical, but it actually matches that of the procedure scope: if you do
set foo bar
in a procedure body, this means setting the local variable unless you stated otherwise using eitherglobal
orvariable
or by using a fully-qualified name (like::ns::foo
).namespace export
仅适用于命名空间中的命令(即proc
):它将它们注册为有资格导入到另一个命名空间中。例如:namespace export
only applies to commands (i.e.proc
s) in the namespace: it registers them as being eligible to be imported into another namespace. For example: