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