1

ユーザーが引数を与えない場合に自動的に引数を取るtclのprocの構文は何ですか?

私は次のようなものを使用しました

    proc a {{args 1}} {
    puts $args
    }

    a

これを使用すると、引数の値が 1 になりません。空白の文字列が返されます。これで私を助けてください。

4

2 に答える 2

3

2 つの異なることを一緒にしようとしているようです。

  1. プロシージャに可変数の引数を受け入れます
  2. 引数が指定されていない場合は、デフォルト値を使用します

このケースを具体的に処理する proc の構文は実際にはありません。ただし、達成するのはかなり簡単です。可変数の引数 (argsキーワード) を受け入れて、指定されているかどうかを確認できます (指定されていない場合はデフォルト値を使用します)。

proc myproc {args} {
    if { [llength [info level 0]] < 2 } { #called with no args
        set args {the default list of values}
    }
    # rest of the code goes here
}

このinfo level 0コマンドは、呼び出されたときに実行された実際のコマンドを引数とともに返します。したがって、結果の長さが 2 未満の場合、現在のコマンドが引数なしで呼び出されたことがわかります (リストの最初の要素が実際のコマンド名そのものであるため)。

于 2012-12-05T07:23:14.373 に答える
1

この単語argsは、proc 定義で特定の意味を持つ予約語です。別の変数名を使用します。

proc a {{x 1}} {
    puts $x
}

a

追加回答

proc 定義では、引数を 2 つのメンバーを持つリストとして定義することにより、デフォルト値が与えられます。最初のメンバーは引数の名前になり、2 番目はデフォルト値になります。

この単語argsは、残りの引数を実装する特別な引数です (つまり、引数リストで指定されていない残りの引数をキャプチャします)。これは、Tcl で可変個引数関数を実装する方法です。

プロシージャを定義するときに、args引数とデフォルト値を一緒に使用できます。ただし、argsデフォルト値を持つことはできません。前述の引数にargsは、デフォルト値を設定できます。ただし、デフォルト値を持つ引数は、デフォルト値のない引数の後にリストする必要があります。したがって、基本的には次のような関数を記述できます。

proc a {x {y 1} args} {
    puts "$x $y ($args)"
}
a 1       ;# prints 1 1 ()
a 1 2     ;# prints 1 2 ()
a 1 2 3 4 ;# prints 1 2 (3 4)

ユースケースがこのパターンを満たしている場合はargs、上記の例のように、デフォルト値で引数を定義できます。argsそうでない場合は、自分で処理するしかありません。

# Assume parameters are key-value pairs,
# if value not given then default to 1
proc b args {
    foreach {x y} $args {
        if {$y == ""} { set y 1 }
        puts "$x -> $y"
    }
}
b 1 2    ;# prints 1 -> 2
b 1 2 3  ;# prints 1 -> 2, 3 -> 1
于 2012-12-05T03:23:28.243 に答える