gpt4 book ai didi

TCL如何调用item handlers

转载 作者:行者123 更新时间:2023-12-04 02:59:19 25 4
gpt4 key购买 nike

我创建了从项目到项目处理程序的映射。

  array set handlers {
handleItem1 handlerFunction1
handleItem2 handlerFunction2
}

但是 handlerFunctions 可以带参数。

所以下面的代码是行不通的。
 if { [info exists handlers($item) ] } {
eval $this $handlers($item)
}

那么我可以更改此代码以便能够调用可以接受参数的处理程序吗?

最佳答案

有几种选择:

  • 命令前缀 如果您使用 Tcl 8.5 或更高版本(8.4 处于生命周期的尽头,如果可能,请升级)然后使用 {*} 扩展命令是最好的方法。
    proc putargs args {puts $args}
    set callback {putargs CALLBACK}
    # Invoke it
    {*}$callback param1 param2 ;# prints CALLBACK param1 param2
  • 脚本片段 评估回调,但在最后添加额外的词。 (跟踪这样做)
    proc putargs args {puts $args}
    set callback {putargs CALLBACK [clock seconds]}
    # Invoke
    eval $callback [list param1 param2] ;# Prints CALLBACK 1369834114 param1 param2

    允许像 set callback {puts "CALLBACK" ;#} 这样的黑客攻击这将忽略该行的其余部分,但速度较慢。
  • 命令 不是很有用,因为你不能通过任何东西。
    proc putargs args {puts $args}
    set callback {putargs CALLBACK}
    # Invoke
    {*}$callback ;# prints CALLBACK
  • 脚本 参数在当前范围内作为变量传递,有时也使用字符串替换(Tk 就是这样做的)
    proc putargs args {puts $args}
    set callback {putargs CALLBACK $param1 $param2}
    # Invoke
    set param1 FOO
    set param2 BAR
    eval $callback ;# prints CALLBACK FOO BAR
  • 命令名称 类似于 Command 前缀,但没有进行扩展。 (Tcllib 的 SASL 为自己的机制这样做)。不建议。
    proc putargs args {puts $args}
    set callback putargs
    # Invoke
    $callback param1 param2

  • 具有最佳性能的最佳解决方案是命令前缀。

    关于TCL如何调用item handlers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16814856/

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