Tcl 中的“设置”与“变量”

问题描述 投票:0回答:1

afaik,在 Tcl 中创建和分配命名空间变量有两种方法:

namespace eval ::myspace:: {
  variable foo 1
}
set ::myspace::bar 2

事实上,两者是等价的:

info vars ::myspace::*
# ::myspace::foo ::myspace::bar

我有一段时间想知道哪一种是首选形式(以及它们是否真的等效)。

namespaces tcl variable-assignment
1个回答
0
投票

set
命令是基本操作。如果给它两个参数,它会解析该变量(通常优先选择局部变量而不是其他名称)并将值写入该变量,返回该变量的内容。 (通常与您写入的值相同。)通过一个参数,它会读取变量。

variable
命令确保该名称将解析为当前命名空间中具有该名称的变量;在具有局部变量的上下文中(在过程或方法内),它会从具有该名称的局部变量到已解析的命名空间变量建立链接。如果您提供一个值,也可以编写一个简单的变量。它可以处理多个变量......但我用得不多。结果是空的。

如果使用带

set
的完全限定变量名,则可以直接写入任何命名空间变量。这只是寻找潜在现实的不同方式;变量不是它们的名称,毕竟名称只是查找变量的一种方式。

链接机制也被

global
upvar
namespace upvar
使用。它非常快(形成后),通常涉及字节码引擎中的单个额外引用。

© www.soinside.com 2019 - 2024. All rights reserved.