我们是否可以在tcl中声明一个行为类似于Java中的实例变量的变量,即一旦声明就可以在类中的任何位置进行访问?

时间:2018-07-30 01:47:12

标签: tcl

我已经尝试过了:

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 =

原因是:转到其他条件,然后无法访问存储在svcCallWithOneChar中的结果。

1 个答案:

答案 0 :(得分:3)

如果您正在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