1

以下委托不起作用。

我如何让它工作?

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

错误截图:

在此处输入图像描述

4

1 回答 1

1

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

我的证据?这个:

% info class instances Tail
::Dog::tail0

但它确实表明我们可以通过改变 to 的定义来解决这个问题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

对我来说看起来不错。

于 2021-07-11T14:08:56.640 回答