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

时间:2010-08-18 14:41:21

标签: tcl

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

3 个答案:

答案 0 :(得分: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
  • 导致调用者看到的数组发生更改

通过数组获取/设置

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
  • 导致调用者看到的数组发生更改
  • 类似的机制可用于返回数组

答案 1 :(得分:5)

other ways,就像首先将其转换为列表一样(通过array getarray set)。

答案 2 :(得分:2)

如果您只传入数组的,则可以传入字典(提示:array get将数组序列化为字典值)并使用{ {3}}命令用来访问其中的值。但是,如果您想要访问实时值,upvar绝对是最简单的。这也是一种非常快速的技术;在upvar本身完成后,它会在变量访问期间编译为指针的额外遍历。