如何在TCL过程外部访问传入proc并已修改的列表?
TCL中在Proc内修改外部列表的方法(不使用返回值)
默认情况下,TCL的proc参数采用传值调用机制。你原代码中调用addNames $names时,是把names的当前值(空列表)复制给proc内部的局部变量names,proc内对这个局部变量的修改不会同步到外部的原变量,这就是外部列表没有变化的原因。
以下是两种无需返回值即可修改外部列表的解决方案:
方法一:使用upvar绑定外部变量
upvar命令可以将调用者作用域中的变量与proc内部的变量建立绑定关系,修改内部变量就等同于修改外部变量。
修改后的代码:
proc addNames { namesVar } { # 将外部作用域的$namesVar变量绑定到proc内的names变量 upvar $namesVar names lappend names tom lappend names harry puts "Inside proc: $names" } set names {} # 传入变量名而非变量值 addNames names puts "Outside of proc: names" puts $names
执行结果:
Inside proc: tom harry Outside of proc: names tom harry
方法二:使用uplevel直接在外部作用域执行命令
uplevel命令可以让指定的命令在调用者的作用域中执行,直接操作外部变量,无需绑定变量。
修改后的代码:
proc addNames { namesVar } { # 在外部作用域执行lappend命令 uplevel [list lappend $namesVar tom] uplevel [list lappend $namesVar harry] # 读取外部变量的值并输出 uplevel [list puts "Inside proc: $$namesVar"] } set names {} addNames names puts "Outside of proc: names" puts $names
执行结果与方法一一致。
内容的提问来源于stack exchange,提问作者A.G.Progm.Enthusiast
相关产品推荐
相关产品推荐

