【问题标题】:TCL dictonary from another sourced file来自另一个源文件的 TCL 字典
【发布时间】:2019-02-23 22:00:41
【问题描述】:

我正在尝试在 TCL 中使用 [dict] 命令。如果我在没有 ixc 命名空间的同一个本地文件中使用以下代码,并且在同一个文件中使用 procs,则以下代码可以完美运行。

但是,如果我尝试在源文件中使用它——它完全可以保释

rawrIxc.tcl

namespace eval ixc {
}

proc ixc::add2Dict {var1 var2 var3 var4} {
variable $var1
puts "ixc:: $var1 $var2 $var3 $var4" ;#Debug in console, shows passed params
dict set $var1 $var2 $var3 $var4
}

proc ixc::getFromDict {var1 var2 var3} {
variable $var1
puts "something: $var1 $var2 $var3"
dict get $var1 $var2 $var3
}

rawrSiteButtons.tcl

将数据添加到字典中。我假设

ixc::add2Dict "button" "comic" "buttonText"  "💎 Comic" ;#Button text "comic"
ixc::add2Dict "button" "comic" "buttonUrl" "/comic" ;#Button URL
ixc::add2Dict "button" "comic" "buttonSymbol" "%1" ;#Actual button ID -- used in mapping
ixc::add2Dict "button" "comic" "urlSymbol" "%_1"]" ;#Button replacement symbol -- used in mapping

但是,当我现在尝试使用以下内容从字典中调用数据时

set buttons(comicText) [ixc::getFromDict $button comic buttonText]
set buttons(comicUrl) [ixc::getFromDict $button comic buttonUrl]
set buttons(comicSymbol) [ixc::getFromDict $button comic buttonSymbol]
set buttons(comicUrlSymbol) [ixc::getFromDict $button comic urlSymbol]

我收到:

can't read "button": no such variable
    while executing
"ixc::getFromDict $button comic buttonText"
    (procedure "loadSiteButtons" line 41)

即使我使用:

variable button

我已经尝试过 upvar、变量和命名空间 upvar [当前命名空间],但现在不知道该去哪里。任何帮助都会很可爱。 谢谢。

【问题讨论】:

  • 不够继续:在你set buttons(...) ...的那一点上,$button的价值是多少?

标签: dictionary tcl proc


【解决方案1】:

当你这样做时:

ixc::add2Dict "button" "comic" "buttonText"  "💎 Comic"

add2Dict 过程设置了一个名为button命名空间变量

所以在调用getFromDict时,需要指定变量的命名空间:

set buttons(comicText) [ixc::getFromDict $ixc::button comic buttonText]

或者,从命名空间内运行整个命令:

set buttons(comicText) [namespace eval ixc {getFromDict $button comic buttonText}]

再看一遍:你的调用有点不同:

  • add2Dict proc 将变量 name 作为第一个参数,但是
  • getFromDict proc 将字典 value 作为第一个参数。

您可以稍微修改 getFromDict 过程以将“buttom”作为变量名称:

proc ixc::getFromDict {var1 var2 var3} {
    variable $var1
    puts "something: $var1 $var2 $var3"
    dict get [set $var1] $var2 $var3
    # .......^^^^^^^^^^^ -- one argument form of `set` to get the value.
}

然后

set buttons(comicText) [ixc::getFromDict button comic buttonText]
# .......................................^^^^^^

【讨论】:

    【解决方案2】:

    Glenn 已经提供了可行的解决方案,但为了完整起见,还可以考虑以下几点:

    (1) 在proc 中,您可以使用variable 命令:

    proc someProc {} {
      variable ::ixc::button
      ixc::add2Dict "button" "comic" "buttonText"  "💎 Comic"
      ixc::getFromDict $button
    }
    

    (2) 从顶层和交互式 Tcl shell 会话中(也可以在 proc 中,作为替代方法),使用 upvar 从当前范围创建到命名空间变量的链接。

    upvar "#0" ::ixc::button button
    ixc::add2Dict "button" "comic" "buttonText"  "💎 Comic"
    ixc::getFromDict $button
    

    另请参阅此答案:TCL calling a namespace variable from a proc outside the namespace

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2021-01-10
      相关资源
      最近更新 更多