据我所知,在tcl中,如果要将命名数组传递给函数,则必须通过被调用者主体中的upvar命令访问调用者的上层作用域。这是在tcl中传递数组的唯一方法吗?
发布于 2010-08-19 21:32:31
正如Michael指出的,有几种方法,外加一个讨论它的wiki页面。仅在这里提供一些信息,以下是一些选项:
由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) => truecaller
发布于 2010-08-18 22:43:10
还有other ways,比如先把它转换成列表(通过array get和array set)。
发布于 2010-08-20 04:29:31
如果只传递数组的值,则可以传入字典(提示:array get将数组序列化为字典值),并使用dict命令访问其中的值。但是,如果您想要访问活动值,upvar绝对是最简单的。这也是一种非常快速的技术;在upvar本身完成后,它会在变量访问期间编译成额外的指针遍历。
https://stackoverflow.com/questions/3513266
复制相似问题