TCL:使用ActiveTcl 8.6传递一个对象作为过程的参数



我是TCL面向对象编程的新手。我安装了ActiveTCL 8.6,其中包括TclOO包,以便在TCL中使用类和对象。我想创建一个对象并调用各种过程来使用它。例如,我尝试了以下代码:

oo::class create Test {
method func {} {
puts "Hello World!"
}
}
proc speak { myObj } {
myObj func
}
Test create testObj
testObj func; # This prints "Hello World!"  
speak testObj; # This raises an error -> invalid command name "myObj"  

我应该怎么做才能在"说话"过程中使用对象testObj?

当您传递对象时,您实际上是在传递对象的名称。变量,即形式参数,然后保存名称,您可以取消引用变量以使用对象(而不是变量本身):

proc speak { myObj } {
$myObj func
}

请注意,您还可以使用一个单参数set来读取变量;下面的代码与上面的代码相当,但更冗长:

proc speak { myObj } {
[set myObj] func
}

也可以为对象创建一个别名,然后可以使用您想要的任何名称,但这是不推荐用于过程的,因为这样的名称总是有效的全局名称。

# Don't do this!
proc speak { myObj } {
interp alias {} $myObj {} myObj
myObj func
}

当您将对象传递到构造函数或将其存储在具有许多可能使用它的命令的命名空间中时,这将更有意义。(事实上,rename将对象放入另一个对象或命名空间,对象将由您将其移入的实体的生存期管理;这是进行UML组合的最简单、最推荐的方法,在TDBC驱动程序的实现中广泛使用。关键是生存期;过程调用通常不是您想要限制传入对象生存期的事情至.)

相关内容

最新更新