关于Tcl命名空间的问题

发布于 2024-11-17 18:57:29 字数 427 浏览 2 评论 0原文

我有两个关于 Tcl 中的命名空间的问题。

namespace eval ::dai {
         set a 5
         set b 10
         namespace export *
}

我的问题是:

  1. export * - 导出将使此命名空间内的某些变量可以在其他命名空间中使用,但是这个 export * 是什么意思? p>

  2. 设置一个5,我们不应该使用变量a 5吗?它们是一样的吗?有些教程说在命名空间内,我们应该使用variable,命名空间中的variableset有什么区别?

I have two question about namespace in Tcl.

namespace eval ::dai {
         set a 5
         set b 10
         namespace export *
}

My questions are:

  1. export * - the export will make some variable inside this namespace can be used in other namespace, but what does this export * mean?

  2. Set a 5, should not we use variable a 5? are they the same? some tutorials say inside namespace, we should use variable, what is the difference between variable and set in namespace?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

找个人就嫁了吧 2024-11-24 18:57:29

1) 对于 Unix 用户来说,“*”是(应该是)合乎逻辑的,意味着“当前可用的一切”。就像当您在 shell 中执行 rm -f * 时,shell 会展开“*”并将其替换为当前目录中存在的所有文件的列表。实际上,正如 namespace 手册所述 您可以指定比简单的“*”更复杂的模式。要了解那里提到的“glob-style”意味着什么,请阅读 字符串匹配

2)“我们不应该使用...”这个问题是不正确的,因为这取决于你想做什么。如果要声明位于命名空间中的变量,请使用variable。如果你想设置一个变量,请使用set,但要注意,如果该变量x尚不存在于命名空间中,Tcl将尝试使用此查找全局变量名称,请参阅:

% set x 5
5
% namespace eval foo {
    set x 10
  }
10
% set x
10
# ^^ observe that the global variable has been assigned
% namespace eval foo {
    variable x
    set x 20
  }
20
% set x
10
# ^^ observe that now `set x 20` found the variable `x` in the namespace and assigned to it

“名称解析”中对此进行了解释命名空间手册页的部分。

请注意,此行为可能看起来不合逻辑,但它实际上与过程范围匹配:如果您在过程主体中执行set foo bar,这意味着设置本地变量,除非您另外声明使用 globalvariable 或使用完全限定名称(如 ::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, as namespace manual states you can specify more elaborate patters than simple "*". To learn what that "glob-style" thing mentioned there means read about string 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, use set, but bevare that if that variable x is not exist in the namespace yet, Tcl will attempt to find a global variablte with this name, see:

% set x 5
5
% namespace eval foo {
    set x 10
  }
10
% set x
10
# ^^ observe that the global variable has been assigned
% namespace eval foo {
    variable x
    set x 20
  }
20
% set x
10
# ^^ observe that now `set x 20` found the variable `x` in the namespace and assigned to it

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 either global or variable or by using a fully-qualified name (like ::ns::foo).

十六岁半 2024-11-24 18:57:29

namespace export 仅适用于命名空间中的命令(即 proc):它将它们注册为有资格导入到另一个命名空间中。例如:

% package require textutil
0.7.1
% textutil::splitx abcdefghij {[aeiou]}
{} bcd fgh j
% splitx abcdefghij {[aeiou]}
invalid command name "splitx"
while evaluating {splitx abcdefghij {[aeiou]}}
% namespace import textutil::*
% splitx abcdefghij {[aeiou]}
{} bcd fgh j

namespace export only applies to commands (i.e. procs) in the namespace: it registers them as being eligible to be imported into another namespace. For example:

% package require textutil
0.7.1
% textutil::splitx abcdefghij {[aeiou]}
{} bcd fgh j
% splitx abcdefghij {[aeiou]}
invalid command name "splitx"
while evaluating {splitx abcdefghij {[aeiou]}}
% namespace import textutil::*
% splitx abcdefghij {[aeiou]}
{} bcd fgh j
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文