【问题标题】:How to use itcl::delegation in TCL?如何在 TCL 中使用 itcl::delegation?
【发布时间】:2021-07-11 12:23:35
【问题描述】:

以下委托不起作用。

如何让它工作?

package require itcl

itcl::extendedclass Tail {
    method wag {} {
        return "Wag, wag, wag"
    }
}

itcl::extendedclass Dog {
    delegate method wag to tail

    constructor {} {
        set tail [Tail #auto]
    }
}

puts [info patchlevel]
puts $itcl::patchLevel

Dog dog
dog wag

错误截图:

【问题讨论】:

    标签: tcl itcl


    【解决方案1】:

    一探究竟,我发现问题是Tail 实例已经创建在Dog 命名空间中(而不是在dog 的实例命名空间或全局范围内)。这很奇怪,但与构造函数中的当前命名空间是::Dog 命名空间这一事实相结合。这不是问题,除非 Itcl 实例构造返回非限定名称,并且处理委托时的当前命名空间与创建 Tail 实例时不同。

    我的证据?这个:

    % info class instances Tail
    ::Dog::tail0
    

    但它确实表明我们可以通过将Dog 的定义更改为:

    itcl::extendedclass Dog {
        delegate method wag to tail
    
        constructor {} {
            # Convert the name into its fully qualified form right now
            set tail [namespace which [Tail #auto]]
        }
    }
    

    有了它,我们可以做到:

    % Dog dog
    dog
    % dog wag
    Wag, wag, wag
    

    我觉得不错。

    【讨论】:

    • 我在这个解决方案中看到的问题是tail 成为Dog 的静态(即公共/类)变量而不是实例变量(不确定这是否是设计使然(其中itcl::delegation 创建一个静态 componentName))。根据我的实验,如果我添加一个构造函数参数“mood”,例如:set tail [namespace which [Tail #auto $mood]],那么Dog 的不同实例不会委托他们自己版本的 $mood。另一方面,通过普通方法的经典委托似乎可以正常工作,例如:variable tail ... set tail [Tail #auto $mood] ... method wag { return [$tail wag] }
    • 我真的不知道你的评论发生了什么。我确实知道它的工作方式与 TclOO 中的等效事物(我非常了解)有着微妙的不同。我确实知道将为每只 Dog 制作一个新的 Tail(并且您真的需要使用完全限定的名称)但不知道设置了哪些变量;我对 itcl 的理解相当肤浅,他们的委托机制是我在回答这个问题之前没有探索过的东西。 (这个答案的初稿完全不同,而且肯定是错误的,但幸运的是我测试了它......)
    • 我在stackoverflow.com/questions/68340828/…发布了一个后续问题。
    • 另外,关于您对命名空间问题的回答和返回非限定名称的 Itcl 实例构造 - 也许这是因为 delegate method wag to tail 大致相当于 method wag {args} {uplevel $tail wag $args}(如文档中所述 tcl.tk/man/tcl/ItclCmd/itcldelegate.html#M6 )。
    • 所有这些事情的通常复杂之处在于与分辨率范围有关,包括命令和变量,这是 itcl 和 TclOO 肯定做不同事情的领域。 (我只知道后者,整个问题将是对子对象的转发。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多