TCLOO:私有方法和方法作为回调

时间:2017-11-28 09:17:08

标签: tcl

使用Tcloo(自编译的TCL 8.6.7)我实现了一个客户端套接字。

我有以下问题:

  1. 我只能在使用oo :: create class
  2. 声明时将方法设为私有
  3. 如何将类的方法注册为。的事件回调 插座。 我尝试过以下方法:

    chan事件$ sock可读[list readSocket $ sock] 错误:无效的命令名称“readSocket”...

    chan事件$ sock可读[list [self] readSocket $ sock] 错误:无效的命令名称“self”...

  4. 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

名称以小写字母开头的方法是公开的,其他是私有的。您还可以使用exportunexport

oo::class create C {
    method foo args {}  ;# public

    method Bar args {}  ;# private

    method Baz args {}  ;# private
    export Baz          ;# now it's public

    method quux args {} ;# public
    unexport quux       ;# now it's private
}

像在Tcl中一样,您可以使用各种方法来定义回调。您需要知道对象使用哪个命名空间,并将my方法限定为该命名空间。

在对象中,可以使用self namespacenamespace which my对内容进行内省,但最简单的方法是使用namespace code

namespace code {my readSocket $sock}
namespace code [list my readSocket $sock]

这些之间的区别在于,在上面一行中,$sock在调用回调时获取变量,而在第二行中,在定义回调时它将被替换。此调用的结果是与命名空间无关的命令前缀,可由任何评估命令执行。请注意,sock必须在上下文中可见:除非已在其上调用variable,否则常规命名空间变量不可见;在所有方法中都可以看到TclOO类级变量。

从对象外部,可以使用info object namespace

来标识对象的命名空间
list [info object namespace $obj]::my readSocket $sock

(在定义回调时评估调用者名称空间中的sock。)

文档: infolistmynamespaceoo::classoo::defineSummary of Tcl language syntax