それはそのままでは機能しません。 $name
はまったく評価されないので、デフォルトはリテラル5文字になります。
あなたがプロシージャを作成するときにデフォルト値を結合している場合、あなたはこのようにそれを行うだろう:
、
proc
への引数は、あなたが構築することができます普通のものですされて
proc GET_PLAYER_INFO [list player_id [list player_name $name]] {
...
}
Tclコマンドと置換。これはTclの素晴らしい点の1つです。
しかし、手順が呼び出された時点で$name
を評価したい場合は、別の方法でそれを行う必要があります。あなたが(例えば、空の文字列)プレイヤー名に使用することはありません値のいくつかの種類を持っていれば、それは非常に簡単です:私はそこに完全修飾変数名を使用しました
proc GET_PLAYER_INFO {player_id {player_name ""}} {
if {$player_name eq ""} {
set player_name $::name
}
...
}
注意。
物事はトリッキーな取得場所はあなたがすべてので、適切なセンチネル値を持っていないてきたときである、あまりにもその名前を取得する他の方法(variable
、...とupvar
で、global
で、例えば、)があります。その時点で、あなたは多くの引数が実際にをした供給方法を確認する必要があります。現在のプロシージャ・コールの引数ワードの
proc GET_PLAYER_INFO {player_id {player_name ""}} {
if {[llength [info level 0]] == 2} {
set player_name $::name
}
...
}
コマンドinfo level 0
戻って完全なリストを。これにはGET_PLAYER_INFO
が含まれており、上の定義の有効な呼び出しで長さ2または3のリストになります。リストが利用可能になると、その長さを確認することはllength
の簡単な練習と数値の比較です。 (センチネル値を使用すると、しかし容易であり、例99.99%で動作します。)
は 最後のオプションは、特別なargs
仮パラメータを使用して、手動で解析を行うことです:あなたが見ることができるように
proc GET_PLAYER_INFO args {
if {[llength $args] < 1 || [llength $args] > 2} {
return -code error "wrong # args: should be \"GET_PLAYER_INFO player_id ?player_name?\""
}
set player_id [lindex $args 0]
if {[llength $args] > 1} {
set player_name [lindex $args 1]
} else {
set player_name $::name
}
...
}
を、これはむしろ長時間です...