使用Tcloo(自编译的TCL 8.6.7)我实现了一个客户端套接字。
我有以下问题:
如何将类的方法注册为。的事件回调 插座。 我尝试过以下方法:
chan事件$ sock可读[list readSocket $ sock] 错误:无效的命令名称“readSocket”...
chan事件$ sock可读[list [self] readSocket $ sock] 错误:无效的命令名称“self”...
任何帮助将不胜感激。
答案 0 :(得分:1)
名称以小写字母开头的方法是公开的,其他是私有的。您还可以使用export
和unexport
。
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 namespace
或namespace 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
。)
文档: info, list, my, namespace, oo::class, oo::define, Summary of Tcl language syntax