我们能在tcl中声明一个变量吗?它的行为有点像Java中的实例变量,即一旦声明,就可以在类中的任何地方访问



我试过这个:

global svcCallWithOneChar ""
if {[catch {set "svcCallWithOneChar = [mimic.list :prefix "l"]"} errmsg]} {
puts $errmsg
} else {
puts "###### Svc Call With prefix set to Single Char n $svcCallWithOneChar  n ##################"
}

但是它会产生这个错误

无法读取"svcCallWithOneChar=

原因是:它进入else条件,然后无法访问存储在svcCallWithOneChar中的结果。

如果您在Tcl中进行面向对象编程,有几个选项。在TclOO中,您定义了一个实例变量,如下所示:

oo::class create Foo {
variable thevariable
...
}

变量thevariable现在可以在Foo类的所有实例中的所有方法中访问。

至于你的示例代码,我真的不知道你想做什么

global命令的参数是要在全局作用域和当前作用域之间链接的变量名。如果调用在过程中,则会创建两个局部变量:svcCallWithOneChar和"(是的,这是一个合法的变量名(。

调用set "svcCallWithOneChar = [mimic.list :prefix "l"]"不是赋值。它是set的单参数形式,因此它尝试访问名为svcCallWithOneChar = foo的变量的值(如果foomimic.list :prefix "l"调用的返回值(。如果后一个调用导致空字符串,那么变量名将变为svcCallWithOneChar =,这正是错误消息所说的。

此外,即使mimic.list :prefix "l"是在双引号字符串中调用的,括号内的文本也不是字符串的一部分(不过,调用的结果会逐字嵌入字符串中(。因此,将第二个参数中的双引号转义为mimic.list意味着该命令得到的是参数"l",而不是l

最新更新