据我所知,在tcl中如果要将命名数组传递给函数,则必须通过被调用者体内的upvar
命令访问调用者的较高范围。这是在tcl中传递数组的唯一方法吗?
答案 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 get
和array set
)。
答案 2 :(得分:2)
如果您只传入数组的值,则可以传入字典(提示:array get
将数组序列化为字典值)并使用{ {3}}命令用来访问其中的值。但是,如果您想要访问实时值,upvar
绝对是最简单的。这也是一种非常快速的技术;在upvar
本身完成后,它会在变量访问期间编译为指针的额外遍历。