将全局变量传递到tclsh中的函数中

将全局变量传递到tclsh中的函数中,tcl,Tcl,我首先为字符串定义了3(全局)常量: set kColorGBegin "\x1b\[1;32m" set kColorRBegin "\x1b\[1;31m" set ColorEnd "\x1b\[0m" 然后,我创建了两个函数来渲染和打印输入字符串: proc r_puts {strs} { puts "${kColorRBegin} ${strs} ${ColorEnd}" } proc g_put

我首先为字符串定义了3(全局)常量:

set kColorGBegin "\x1b\[1;32m"
set kColorRBegin "\x1b\[1;31m"
set ColorEnd  "\x1b\[0m"

然后,我创建了两个函数来渲染和打印输入字符串:

proc r_puts {strs} {
  puts "${kColorRBegin} ${strs} ${ColorEnd}"
}
proc g_puts {strs} {
  puts "${kColorGBegin} ${strs} ${ColorEnd}"
}
并调用:

[r_puts "foo"]
[g_puts "bar"]
我在运行此程序时收到错误消息:

can't read "kColorRBegin": no such variable
    while executing
"puts "${kColorRBegin} ${strs} ${ColorEnd}""
    (procedure "r_puts" line 2)
    invoked from within
"r_puts "foo""
    invoked from within
"[r_puts "foo"]"
    (file "./t.tcl" line 14)
我如何解决它


完整代码如下:

set kColorGBegin "\x1b\[1;32m"
set kColorRBegin "\x1b\[1;31m"
set ColorEnd  "\x1b\[0m"

proc g_puts {strs} {
  puts "${kColorGBegin} ${strs} ${ColorEnd}"
}

proc r_puts {strs} {
  puts "${kColorRBegin} ${strs} ${ColorEnd}"
}

[r_puts "foo"]
[g_puts "bar"]


在Tcl中,过程中的所有变量都是过程的局部变量,除非您在该过程中另有说明;从长远来看,必须明确这一点可以避免各种各样的麻烦。(在对象方法中,事情稍微复杂一些,但您没有处理这些问题,即使这样,它们也只有在您明确要求时才会变得复杂。)这通常是在过程内部完成的,如下所示:

proc r_puts {strs} {
    global kColorRBegin ColorEnd
    puts "${kColorRBegin} ${strs} ${ColorEnd}"
}
proc g_puts {strs} {
    global kColorGBegin ColorEnd
    puts "${kColorGBegin} ${strs} ${ColorEnd}"
}
您可能希望省略变量替换之间的空格



用于此操作的其他命令有:
variable
(通常在处理非全局名称空间中的少量变量时)、
upvar
(在处理调用方按名称传递的变量时)和
namespace upvar
(在非全局名称空间中处理多个变量时).

不要在对r_put和g_put的调用周围加括号:这将以命令替换的形式调用进程,用结果替换命令替换,然后尝试以命令的形式执行结果

演示:


Aldo显式指定全局命名空间:
$::kColorRBegin
$ tclsh
% proc r_puts {msg} {puts $msg}
% r_puts hello
hello
% [r_puts hello]
hello
ambiguous command name "": after append apply ...