在Tcl中将变量从下proc传递到上proc



我有以下代码,它在内部循环中打印变量c的相同值。

global c
proc one { a c } {
for {set i $a} {$i < 10} {incr i} {
two $c
}
}
proc two { c } {
incr c
puts "Value of c is $c"
}

当我用以下输入运行它时:

two 0 3

它打印10次"c的值为4",而不是在循环中不断将c的值从4增加到13。

问题是,来自proc two的c的值没有再次传递到for循环,并且它从proc one解析器c获得的值与3相同。如何获得所需的输出?

听起来您想通过引用将变量cproc one传递到proc two,以便将变量值的更改反映回调用者中。

tcl中实现这一点的一种方法是传递变量的名称,并使用upvar命令,如下所示:

proc one { a c } {
for {set i $a} {$i < 10} {incr i} {
two c  ;# <= note: passing 'c' by name, not by value
}
}
proc two { c_name } {
upvar $c_name c  ;# <= note: c in this proc is using callers variable
incr c
puts "Value of c is $c"
}
one 0 3

以上产生以下输出:

Value of c is 4
Value of c is 5
Value of c is 6
Value of c is 7
Value of c is 8
Value of c is 9
Value of c is 10
Value of c is 11
Value of c is 12
Value of c is 13

我知道以下内容并不能反映OP的实际问题,这更像是一个重新考虑设计的建议。为什么要从这里开始使用"通过引用"参数传递?

为什么不简单地坚持使用return的函数样式,并在循环体的脚本中不断更新proc局部变量c呢?

proc one { a c } {
for {set i $a} {$i < 10} {incr i} {
set c [two $c] ;# <= note: passing 'c' by value
puts "Value of c is $c"
}
}
proc two { c_value } {
incr c_value
return $c_value
}
one 0 3

这将使two在不同的上下文中可由不同的调用者重新使用。此外:它可以很容易地扩展到多个返回值,在调用方的上下文(one(中使用lassign进行变量更新。

相关内容

  • 没有找到相关文章

最新更新