哪种方式更好:
variable var1 $current_file_generation_info::language
OR
set var1 $current_file_generation_info::language
另外,哪种方式更好:
variable current_file_generation_info::language $var1
OR
set current_file_generation_info::language $var1
答案 0 :(得分:1)
如果在namespace eval
中,请使用variable
以避免变量名解析器的怪异。 (我不想详细描述它的作用,除了说依赖它的代码可以自动描述为错误并且难以准确描述方法。)
如果在一个过程中,(通常)使用set
,除非你想要一个本地变量(与命名空间变量的最后一个组件同名)与本地变量耦合因此任何对一个人的操纵都是对另一个人的操纵。例如,如果你这样做:
variable foobar::grill "sprocket"
将创建局部变量grill
并将其绑定到命名空间grill
中的命名空间变量foobar
(相对于当前命名空间或全局命名空间;这是“命名空间”分辨率“和更简单比变量分辨率,如上所述!)。命名空间变量grill
,如果它已经不存在,将被特别标记为现有(但最初未设置)。最后,因为我们提供了一个值(sprocket
),它将存储在命名空间变量中(因此也会出现在局部变量中)。
如果您要在一个过程中多次读取或写入命名空间变量,那么将它绑定到局部变量并以此方式处理它会快得多。一旦绑定,你就无法解开它们,但这通常不是问题。 (请注意,当您使用upvar
或global
或namespace upvar
时,绑定过程实际上是相同的,尽管每种方法都有不同的方式来查找它绑定的内容。)
如果您正在做所有这些来模拟类,请考虑使用真实类。有几个选项(包括Tcl,XOTcl,TclOO,Snit)。