ユーザーが引数を与えない場合に自動的に引数を取るtclのprocの構文は何ですか?
私は次のようなものを使用しました
proc a {{args 1}} {
puts $args
}
a
これを使用すると、引数の値が 1 になりません。空白の文字列が返されます。これで私を助けてください。
ユーザーが引数を与えない場合に自動的に引数を取るtclのprocの構文は何ですか?
私は次のようなものを使用しました
proc a {{args 1}} {
puts $args
}
a
これを使用すると、引数の値が 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 未満の場合、現在のコマンドが引数なしで呼び出されたことがわかります (リストの最初の要素が実際のコマンド名そのものであるため)。
この単語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