首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TCL中使用itcl::delegation?

如何在TCL中使用itcl::delegation?
EN

Stack Overflow用户
提问于 2021-07-11 20:23:35
回答 1查看 39关注 0票数 1

以下委派不起作用。

我怎么才能让它工作?

代码语言:javascript
复制
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

错误屏幕截图:

EN

回答 1

Stack Overflow用户

发布于 2021-07-11 22:08:57

仔细查看之后,我发现问题在于Tail实例是在Dog名称空间中创建的(而不是在dog的实例名称空间或全局范围中创建的)。这很奇怪,但与构造函数中的当前名称空间是::Dog名称空间这一事实相关联。这不是问题,除非Itcl实例构造返回非限定名称,并且处理委托时的当前命名空间与创建Tail实例时的命名空间不同。

我的证据?这一点:

代码语言:javascript
复制
% info class instances Tail
::Dog::tail0

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

代码语言:javascript
复制
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]]
    }
}

这样,我们就可以做到:

代码语言:javascript
复制
% Dog dog
dog
% dog wag
Wag, wag, wag

在我看来还可以。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68336192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档