【问题标题】:TCLOO: Private Method And Method As CallbackTCLOO:私有方法和方法作为回调
【发布时间】:2017-11-28 19:54:22
【问题描述】:

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

我有以下问题:

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

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: tcl


    【解决方案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。)

    文档: info, list, my, namespace, oo::class, oo::define, Summary of Tcl language syntax

    【讨论】:

    • 感谢您的回答。我还追踪了错误的原因,它们发生是因为我使用“命名空间路径 {::tcl::mathop}”来访问 mathop 运算符命令。我已经导入了命名空间并且错误消失了。谢谢,问题解决了
    • 我一直在想是否应该编写一个辅助命令来创建回调,但它的作用就像上面列出的答案选项所描述的那样。
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 2011-04-18
    • 2018-05-03
    • 2010-11-04
    • 2011-09-19
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多