首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCL:使用ActiveTcl 8.6将对象作为过程的参数传递

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

Stack Overflow用户
提问于 2013-12-21 22:03:46
回答 1查看 501关注 0票数 2

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

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 2013-12-22 00:10:37

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

代码语言:javascript
复制
proc speak { myObj } {
    $myObj func
}

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

代码语言:javascript
复制
proc speak { myObj } {
    [set myObj] func
}

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

代码语言:javascript
复制
# Don't do this!
proc speak { myObj } {
    interp alias {} $myObj {} myObj
    myObj func
}

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20719800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档