2012-03-16 10 views
5

私は、次のコードにについてのTclのパラメータを渡すことについて質問があります。上記のコードに係るTCLでは、このようにパラメータを渡すことはできますか?

set name "Ronaldo" 

proc GET_PLAYER_INFO {player_id {player_name "$name"}} { 
    global name 
    puts $player_name 
} 

を、私たちはグローバル変数「name」を持っている、とPROC GET_PLAYER_INFO、デフォルトのパラメータリストでパラメータplayer_nameの値が "$ name"に設定されていますか? nameの値が "ronaldo"の場合、すでに二重引用符で囲まれています。このようにパラメータリストに二重引用符を入れる必要がありますか?player_name "$ name"? "global name"コマンドを実行する前に、player_nameのデフォルト値は "Ronaldo"ですか?それで、私たちはなぜprocに "グローバル名"コマンドを持つ必要があるのですか?

答えて

7

それはそのままでは機能しません。 $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 
    } 
    ... 
} 

を、これはむしろ長時間です...

関連する問題