我对TCL中的面向对象编程是个新手。为了使用ActiveTCL中的类和对象,我安装了Tcl8.6,其中包括TclOO包。我想创建一个对象并调用各种过程来使用它。例如,我尝试了以下代码:
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" 我应该怎么做才能在“说”程序中使用object testObj?
发布于 2013-12-22 00:10:37
当你传递一个对象时,你实际上是在传递对象的名称。然后,变量(形参)保存名称,您取消对变量的引用以使用对象(而不是变量本身):
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驱动程序的实现中被广泛使用。关键是生命周期;过程调用通常不是您想要限制传入对象的生命周期的东西。)
https://stackoverflow.com/questions/20719800
复制相似问题