哪种方式更好?变量相关

时间:2014-04-19 13:41:58

标签: tcl

哪种方式更好:

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

1 个答案:

答案 0 :(得分:1)

如果在namespace eval中,请使用variable 以避免变量名解析器的怪异。 (我不想详细描述它的作用,除了说依赖它的代码可以自动描述为错误并且难以准确描述方法。)

如果在一个过程中,(通常)使用set ,除非你想要一个本地变量(与命名空间变量的最后一个组件同名)与本地变量耦合因此任何对一个人的操纵都是对另一个人的操纵。例如,如果你这样做:

variable foobar::grill "sprocket"

将创建局部变量grill并将其绑定到命名空间grill中的命名空间变量foobar(相对于当前命名空间或全局命名空间;这是“命名空间”分辨率“和更简单比变量分辨率,如上所述!)。命名空间变量grill,如果它已经不存在,将被特别标记为现有(但最初未设置)。最后,因为我们提供了一个值(sprocket),它将存储在命名空间变量中(因此也会出现在局部变量中)。

如果您要在一个过程中多次读取或写入命名空间变量,那么将它绑定到局部变量并以此方式处理它会快得多。一旦绑定,你就无法解开它们,但这通常不是问题。 (请注意,当您使用upvarglobalnamespace upvar时,绑定过程实际上是相同的,尽管每种方法都有不同的方式来查找它绑定的内容。)


如果您正在做所有这些来模拟类,请考虑使用真实类。有几个选项(包括Tcl,XOTcl,TclOO,Snit)。