来自另一个源文件的 TCL 字典
TCL dictonary from another sourced file
我正在尝试在 TCL 中使用 [dict] 命令。如果我在没有 ixc 命名空间的同一个本地文件中使用它并且在同一个文件中使用 proc,则以下代码可以完美地工作。
但是,如果我尝试在源文件中使用它 -- 它完全没有问题
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 [namespace current],但现在不知道该去哪里。任何帮助都会很可爱。
谢谢。
当你这样做时:
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" 作为 var 名称:
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]
# .......................................^^^^^^
Glenn 已经提供了可行的解决方案,但为了完整起见,还可以考虑以下内容:
(1) 在 proc
中,您可以使用 variable 命令:
proc someProc {} {
variable ::ixc::button
ixc::add2Dict "button" "comic" "buttonText" "💎 Comic"
ixc::getFromDict $button
}
(2) 从顶层和您的交互式 Tcl shell 会话(但也可以从 proc
中,作为替代),使用 upvar
创建一个link 从当前作用域到命名空间变量。
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
我正在尝试在 TCL 中使用 [dict] 命令。如果我在没有 ixc 命名空间的同一个本地文件中使用它并且在同一个文件中使用 proc,则以下代码可以完美地工作。
但是,如果我尝试在源文件中使用它 -- 它完全没有问题
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 [namespace current],但现在不知道该去哪里。任何帮助都会很可爱。 谢谢。
当你这样做时:
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" 作为 var 名称:
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]
# .......................................^^^^^^
Glenn 已经提供了可行的解决方案,但为了完整起见,还可以考虑以下内容:
(1) 在 proc
中,您可以使用 variable 命令:
proc someProc {} {
variable ::ixc::button
ixc::add2Dict "button" "comic" "buttonText" "💎 Comic"
ixc::getFromDict $button
}
(2) 从顶层和您的交互式 Tcl shell 会话(但也可以从 proc
中,作为替代),使用 upvar
创建一个link 从当前作用域到命名空间变量。
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