2011-06-23 11 views

Odpowiedz

11

Tak, ale nie można używać nawiasów klamrowych ({}) dla swojej listy argumentów. Deklarujesz procedurę, np. w ten sposób:

proc log [list message [list output $::output]] { 
    .... 
} 

Ale należy pamiętać:
Zmienna jest oceniana w chwili, gdy procedura jest zadeklarowana, nie wtedy, gdy jest on wykonywany!

+2

+1: To jest idealny dla domyślnych definicja czasu. –

7

Jeśli chcesz ustawić domyślny argument, który jest zdefiniowany w wartości tylko w czasie połączenia, musisz być bardziej skomplikowany. Kluczem jest to, że można użyć info level 0 aby otrzymać listę argumentów do bieżącego wywołania procedury, a następnie po prostu sprawdzić długość tej listy:

proc log {message {output ""}} { 
    if {[llength [info level 0]] < 3} { 
     set output $::output 
    } 
    ... 
} 

Pamiętaj, że podczas sprawdzania listy argumentów, pierwszy z nich jest nazwą samego polecenia.

+0

+1 dla sprawdzenia liczby dostarczonych argumentów, a po prostu sprawdzenia, czy wynik był pusty! Cóż, dostaniesz +1 na użyteczne odpowiedzi, ale cieszę się, że zrobiłeś to w ten sposób :) – RHSeeger

+0

Doskonała odpowiedź, ale uważaj, że w ten sposób nie możesz rozróżnić użytkownika, który wydał polecenie "log hello" "" i "log hello". Możesz zmienić domyślny ciąg wyjściowy (zmieniając ""), ale wtedy pojawi się podobny problem z nową wartością. Może nie zdarza się to często, ale kiedy to się dzieje ... – Roalt

+0

@Roalt: Czy chciałeś dodać ten komentarz do drugiej odpowiedzi? Dzięki mojemu można rozróżnić, po prostu _konta_ ile wartości faktycznie dostarczono. To takie proste. –

1

Innym sposobem, aby to zrobić:

proc log {message {output ""}} { 
    if {$output eq ""} { 
     set output $::output 
    } 
}