将数组传递给tcl中的函数.只有upvar?

Ste*_*ini 5 tcl

据我所知,在tcl中如果要将命名数组传递给函数,则必须通过upvar被调用者体内的命令访问调用者的较高范围.这是在tcl中传递数组的唯一方法吗?

RHS*_*ger 9

正如Michael指出的那样,有几种方法,还有一个讨论它的维基页面.只是在这里有一些信息,一些选项是:

由Upvar

proc by_upvar {&arrName} {
    upvar 1 ${&arrName} arr
    puts arr(mykey)
    set arr(myotherkey) 2
}
set myarr(mykey) 1
by_upvar myarr
info exists myarr(myotherkey) => true
Run Code Online (Sandbox Code Playgroud)
  • 导致调用者看到的数组发生更改

通过数组get/set

proc by_getset {agv} {
    array set arr $agv
    puts arr(mykey)
    set arr(myotherkey) 2
    return [array get arr]
}
set myarr(mykey) 1
array set mynewarr [by_upvar myarr]
info exists myarr(myotherkey) => false
info exists mynewarr(myotherkey) => true
Run Code Online (Sandbox Code Playgroud)
  • 导致调用者看到的数组发生更改
  • 类似的机制可以用来返回一个数组


Mic*_*ael 5

还有其他方法,比如首先将它转换为列表(通过array getarray set).