3

ベスト プラクティスについて、TCL の専門家からのアドバイスを希望します。

proc を使用して、特定のデータを含むリストを作成したいとします。今、最良の方法はどれですか?

proc processList { myList } {
   upvar $myList list_
    #append necessary data into list_
}

proc returnList {} {
    set list_ {} 
    #append necessary data into list_
    return $list_
}

set list1 {}
processList list1

set list2 [returnList ]

このプラクティスのどれが推奨されますか?

編集: 申し訳ありませんが、この質問に回答した人々のコンセンサス (および説明) を理解できません。

4

3 に答える 3

7

私はほぼ常に2番目の方法を使用しています。

proc returnList {} {
    set result {}
    # ... accumulate the result like this ...
    lappend result a b c d e
    return $result
}
set lst [returnList]

メモリの使用量や速度にはほとんど違いはありませんが、機能的には考えやすくなっています。また、Tcl 8.5 では、結果リストを比較的簡単に分割できます (それが必要な場合)。

set remainderList [lassign [returnList] firstValue secondValue]

これで、ain $firstValuebin secondValue、およびc d ein になり$remainderListます。

于 2011-06-24T08:32:08.393 に答える
3

最初のオプションは既存のリストを変更し、2番目のオプションは新しいリストを作成します。より良い比較のために、パラメーターを追加し、returnList()そのパラメーターから戻り値を作成します。

その場合、違いは、パラメーターの受け渡し方法(参照または値による)と、各操作に必要なメモリバジェットにあります。

2番目の方法では副作用はありませんが、リストが膨大な場合は非常に時間がかかる可能性があります。

どちらか一方を推奨するための一般的な規則はありません。私自身のルールは、他の制約がそうしないように導かない限り、2番目の方法から始めることです。

于 2011-06-24T08:25:50.743 に答える
0

同等の構文は次のようになります。

set lst [returnList]

一度に複数のリストを返したい場合は?

あなたがこのようなことをした場合、私は考えました:

return [$list1 $list2]

lindex でアクセスできるリストのリストを返すはずでした。しかし、それは正確にはそうではないようです。実際には、2 つのリストが返されるだけで、外部の中括弧でそれらを 1 つのリストにグループ化する必要はありません。Perl では、次のようなことができます。

($var1, $var2) = process_that_returns_two_values;

しかし、「set」がTclでそれを許可するとは思いません。

于 2014-03-04T20:24:59.410 に答える