在Tcl v8.4中,proc返回数组的最佳方法是什么?

Wil*_*mKF 2 arrays variables tcl

如果我有一个需要将数组返回给调用者的proc,那么最好的方法是什么?

由于无法使用$数组变量,因此下面的代码在Tcl中不起作用:

proc mine {} {
  array set foo { red 1 blue 2 green 3 }
  $foo
}

tcl> set foo [mine]
Error: can't read "foo": variable is array
Run Code Online (Sandbox Code Playgroud)

或者,这也不起作用:

proc mine {} {
  array set foo { red 1 blue 2 green 3 }
  array get foo
}

tcl> set foo [mine]

tcl> puts $foo(blue)
Error: can't read "foo(blue)": variable isn't array
Run Code Online (Sandbox Code Playgroud)

这让我可能效率低下:

proc mine {} {
  array set foo { red 1 blue 2 green 3 }
  array get foo
}

tcl> array set foo [mine]
2
Run Code Online (Sandbox Code Playgroud)

或者模糊不清:

proc mine {varName} {
  upvar $varName localVar
  array set localVar { red 1 blue 2 green 3 }
}

tcl>unset foo
tcl>mine foo
tcl>puts $foo(blue)
2
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点,或者如果没有,哪个是最有效的?

Bry*_*ley 6

我想你已经回答了自己的问题.简单地说,你不能返回一个数组.您可以在问题中解释选项:

1)您可以返回数组值,并将其转换回调用者中的数组2)您可以在过程中使用upvar,以便调用者传入可以修改的数组名称.

如果您使用的是tcl 8.5,则可能需要考虑切换到使用dict.Dicts是可以传递,从程序返回等的第一类对象.