我是TCL中面向对象编程的新手。我安装了包含TclOO包的ActiveTCL 8.6,以便在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?
答案 0 :(得分:3)
当您传递对象时,您实际 传递对象的名称。变量,形式参数,然后保持名称,您取消引用变量以使用对象(而不是变量本身):
proc speak { myObj } {
$myObj func
}
请注意,您还可以使用单参数set
来读取变量;下面的代码与上面的代码相同,但更加冗长:
proc speak { myObj } {
[set myObj] func
}
也可以为对象创建一个别名,然后可以为其指定任何名称,但对于过程,这是 not ,因为这些名称始终是有效的全局名称。
# Don't do this!
proc speak { myObj } {
interp alias {} $myObj {} myObj
myObj func
}
当您将对象传递给构造函数或将其存储在具有许多可能使用它的命令的命名空间中时,这会更有意义。 (事实上,rename
对象进入另一个对象或命名空间,对象将由您移动到的实体的生命周期来管理;这是执行UML组合的最简单,最推荐的方式,并且在TDBC驱动程序的实现中广泛使用。关键是生命周期;过程调用通常不是要限制传入对象的生命周期。)