2013-12-21 67 views
2

我是TCL中面向对象编程的新手。我安装了包含TclOO包的ActiveTCL 8.6,以便在TCL中使用类和对象。我想创建一个对象并调用各种过程以使用它。例如,我尝试了下面这段代码:TCL:将对象作为过程的参数传递给ActiveTcl 8.6

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" 

我应该怎么做才能在“speak”过程中使用对象testObj?

回答

3

当您传递一个对象时,您实际上是传递了名称的对象。然后,将变量,形式参数,持有的名称和取消引用变量使用对象(而不是变量本身):

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驱动程序,关键是一生;过程调用通常不是你想限制传入对象的生命期的东西。)

+0

非常感谢! – Rubeinstein

相关问题