2

配列を呼び出し元に返す必要がある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

または、これも機能しません。

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以降を使用している場合は、dictの使用を検討できます。彼らは一般的に速くてきれいになるでしょう。

于 2009-09-23T17:25:00.617 に答える