2012-03-16 9 views
5

Mam pytanie dotyczące przekazywania parametrów w Tcl odnośnie do następującego kodu:W TCL, czy możemy przekazywać parametry w ten sposób?

set name "Ronaldo" 

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

odniesieniu do powyższego kodu, mamy zmienną globalną „Nazwa”, a na liście parametrów proc GET_PLAYER_INFO domyślny wartość parametru player_name jest ustawiona na "$ name"? jeśli wartością nazwy jest "ronaldo", jest to już podwójna oferta, czy musimy umieścić podwójną ofertę na liście parametrów w następujący sposób: player_name "$ name"? i zanim wykonamy polecenie "global name", czy domyślną wartością player_name jest "Ronaldo"? dlaczego tak jest, dlaczego potrzebujemy mieć polecenie "global name" w naszym proc?

Odpowiedz

7

To nie zadziała tak jak jest; $name nie będzie w ogóle analizowany, więc domyślne będą te dosłownie pięć znaków.

Jeśli wiążący wartość domyślną w momencie tworzenia procedury, można to zrobić tak:

proc GET_PLAYER_INFO [list player_id [list player_name $name]] { 
    ... 
} 

Oznacza to, że argumenty proc to zwykłe rzeczy można skonstruować z Komendy Tcl i substytucje. To jedna z najlepszych rzeczy na temat Tcl.

Jeśli jednak chcesz ocenić to $name w momencie wywoływania procedury, musisz zrobić to inaczej. Jeśli masz jakieś wartości, które nigdy nie będzie używany jako nazwa gracza (np pusty string) to jest to całkiem proste:

proc GET_PLAYER_INFO {player_id {player_name ""}} { 
    if {$player_name eq ""} { 
     set player_name $::name 
    } 
    ... 
} 

Zauważ, że użyłem w pełni kwalifikowaną nazwę zmiennej tam . Istnieją inne sposoby, aby ta nazwa też (na przykład z global z upvar z variable ...)

W miejscu, gdzie robi się trudne, kiedy masz nie ma odpowiedniej wartości wskaźnikowych w całej. W tym momencie, trzeba zobaczyć, jak wiele argumentów były faktycznie zestawie:

proc GET_PLAYER_INFO {player_id {player_name ""}} { 
    if {[llength [info level 0]] == 2} { 
     set player_name $::name 
    } 
    ... 
} 

Komenda info level 0 Zwraca pełną listę słów argument bieżącego wywołania procedury. Obejmuje to samą GET_PLAYER_INFO i będzie listą o długości 2 lub 3 w poprawnym wywołaniu powyższej definicji. Gdy lista jest dostępna, sprawdzenie jej długości jest trywialnym ćwiczeniem z llength i porównaniem numerycznym. (Przy użyciu wartości wskaźnikowych jest łatwiej, choć i działa w 99,99% przypadków).

Ostatnią opcją jest użycie specjalnego args formalny parametr i wykonać parsowanie ręcznie:

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 
    } 
    ... 
} 

Jak widać , to jest raczej długotrwałe ...

Powiązane problemy