最近我发现了namespace
概念以及对程序变量使用双冒号(::)。
在开始重塑我的所有脚本之前,我想知道使用global
关键字和双冒号语法访问变量之间是否存在真正的区别。
例如
set var bla
proc kuku {} { puts $::var }
VS。
proc gaga {} {global var ; puts $var}
在这两种情况下,我都会得到“反对”。写在我的屏幕上。
我缺少什么?
我理解编辑变量会有点问题(甚至可能吗?),但对于只读变量,这两种方法有区别吗?
答案 0 :(得分:2)
他们在谈论同一个变量。使用::var
表单,您使用的是完全限定名称,而使用带有global
的表单,您将创建一个指向全局变量的本地链接(真正是指向全局变量的指针。无论您选择哪种方式,阅读或写作都应该完全相同。
两者之间存在可衡量的差异。使用global
,您将获得设置链接的额外成本,但此后在剩余的程序中,每次使用的成本(读取或写入)要低得多。使用另一种形式,您不需要支付任何设置开销,但每次使用成本更高。仅供一次使用,两者的成本非常相似。如果您多次使用该变量,global
会更便宜。 OTOH,有时使用完全限定版本更清楚(尽管速度降低,但vwait
和trace
尤其如此)。
我发现我使用完全限定的表单访问::env
和::tcl_platform
数组,但大多数其他内容将通过global
访问。这只是我的偏好。
以下是交互式会话示例:
% set x 1
1
% proc y1 {} {incr ::x;return ok}
% time { y1 } 10000
0.5398216 microseconds per iteration
% proc y2 {} {global x;incr x;return ok}
% time { y2 } 10000
0.4537753 microseconds per iteration
% proc z1 {} {return $::x}
% time { z1 } 10000
0.4864713 microseconds per iteration
% proc z2 {} {global x; return $x}
% time { z2 } 10000
0.4433554 microseconds per iteration
(我不希望你得到和我一样的绝对数字。做你自己的性能测试。我希望有类似的相对数字......)