gpt4 book ai didi

namespaces - TclOO : cross-object namespace export/import

转载 作者:行者123 更新时间:2023-12-04 17:01:51 25 4
gpt4 key购买 nike

如何设置 TclOO 跨对象命名空间传输?

具体来说,在下面的例子中:

  • runner对象需要将其方法命名空间导出为命令
  • invoker对象需要导入 runner用作 DSL 的命名空间

  • Tcl 8.6 中的以下示例:
    #!/usr/bin/env tclsh
    namespace eval ::runner {
    ::oo::class create Runner {
    constructor {} {
    namespace export RUN
    puts "runner.export: [namespace export]"
    }
    method RUN {} {
    puts "runner.RUN"
    }
    }
    }
    namespace eval ::invoker {
    ::oo::class create Invoker {
    variable runner
    constructor {} {
    set runner [::runner::Runner new]
    set runnerNS [info object namespace $runner]
    namespace import ${runnerNS}::*
    puts "invoker.import: [namespace import]"
    }
    method process {} {
    puts "invoker.process: [RUN]"
    }
    }
    }
    set invoker [::invoker::Invoker new]
    $invoker process

    产生这个错误:
    runner.export: RUN
    invoker.import:
    invalid command name "RUN"
    while executing
    "RUN"
    (class "::invoker::Invoker" method "process" line 2)

    最佳答案

    TclOO 方法不是命令。 (从技术上讲,这是因为它们具有不同的 C 签名。)要使其工作,您需要在充当该方法委托(delegate)的对象中创建一个额外的命令;有效地做到这一点的技巧是使用 tailcall my做 dispatch 。

    oo::class create Runner {
    constructor {} {
    proc RUN args {tailcall my RUN {*}$args}
    namespace export RUN
    puts "runner.export: [namespace export]"
    }
    method RUN {} {
    puts "runner.RUN"
    }
    }

    关于namespaces - TclOO : cross-object namespace export/import,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50349912/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com