afaik,在 Tcl 中创建和分配命名空间变量有两种方法:
namespace eval ::myspace:: {
variable foo 1
}
set ::myspace::bar 2
事实上,两者是等价的:
info vars ::myspace::*
# ::myspace::foo ::myspace::bar
我有一段时间想知道哪一种是首选形式(以及它们是否真的等效)。
set
命令是基本操作。如果给它两个参数,它会解析该变量(通常优先选择局部变量而不是其他名称)并将值写入该变量,返回该变量的内容。 (通常与您写入的值相同。)通过一个参数,它会读取变量。
variable
命令确保该名称将解析为当前命名空间中具有该名称的变量;在具有局部变量的上下文中(在过程或方法内),它会从具有该名称的局部变量到已解析的命名空间变量建立链接。如果您提供一个值,也可以编写一个简单的变量。它可以处理多个变量......但我用得不多。结果是空的。
如果使用带
set
的完全限定变量名,则可以直接写入任何命名空间变量。这只是寻找潜在现实的不同方式;变量不是它们的名称,毕竟名称只是查找变量的一种方式。
链接机制也被
global
、upvar
和 namespace upvar
使用。它非常快(形成后),通常涉及字节码引擎中的单个额外引用。