2

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

由于无法 $ 数组变量,我下面的代码在 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

或者,这也不起作用:

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

这给我留下了可能效率低下的问题:

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

tcl> array set foo [mine]
2

或者晦涩的:

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

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

4

2 回答 2

6

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

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

如果您使用的是 tcl 8.5,您可能需要考虑切换到使用 dict。字典是可以传递、从过程返回等的第一类对象。

于 2009-09-23T17:26:01.683 回答
3

如果您需要使用数组,我的偏好是您展示的 [array get/set] 组合:

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

tcl> array set foo [mine]
2

话虽如此,如果您使用的是 Tcl 8.5 或更高版本,则可以考虑使用 dicts。它们通常会更快、更清洁。

于 2009-09-23T17:25:00.617 回答