Szukaj…


Uwagi

Referencje: proc
Rozszerzenie argumentów (sekcja 5)

Procedura, która nie przyjmuje argumentów

proc myproc {} {
    puts "hi"
}
myproc
# => hi

Pusta lista argumentów (drugi argument po nazwie procedury „myproc”) oznacza, że procedura nie przyjmuje argumentów.

Procedura akceptująca dwa argumenty

proc myproc {alpha beta} {
    ...
    set foo $alpha
    set beta $bar     ;# note: possibly useless invocation
}

myproc 12 34          ;# alpha will be 12, beta will be 34

Jeśli lista argumentów składa się ze słów, będą to nazwy zmiennych lokalnych w procedurze, a ich wartości początkowe będą równe wartościom argumentów w wierszu poleceń. Argumenty przekazywane są przez wartość i cokolwiek stanie się z wartościami zmiennymi wewnątrz procedury, nie wpłynie na stan danych poza procedurą.

Procedura, która akceptuje zmienną liczbę argumentów

### Definition
proc myproc {alpha {beta {}} {gamma green}} {
    puts [list $alpha $beta $gamma]
}
### Use
myproc A
# => A {} green
myproc A B
# => A B green
myproc A B C
# => A B C

Ta procedura przyjmuje jeden, dwa lub trzy argumenty: parametry, których nazwy są pierwszym elementem na liście dwóch elementów, są opcjonalne. Zmienne parametrów ( alpha , beta , gamma ) otrzymują tyle wartości argumentów, ile jest dostępnych, przypisanych od lewej do prawej. Zmienne parametrów, które nie otrzymują żadnych wartości argumentów, zamiast tego pobierają swoje wartości z drugiego elementu listy, którego były częścią.

Zauważ, że opcjonalne argumenty muszą znajdować się na końcu listy argumentów. Jeśli argument N-1 jest opcjonalny, argument N musi być również opcjonalny. Jeśli w przypadku, gdy użytkownik ma argument N, ale nie argument N-1 , podczas wywoływania procedury należy wyraźnie podać wartość domyślną argumentu N-1 przed argumentem N.

myproc A B C D
# (ERROR) wrong # args: should be "myproc alpha ?beta? ?gamma?"

Procedura nie przyjmuje więcej niż trzech argumentów: zauważ, że automatycznie tworzony jest pomocny komunikat o błędzie opisujący składnię argumentu.

Procedura, która akceptuje dowolną liczbę argumentów

proc myproc args { ... }
proc myproc {args} { ... } ;# equivalent

Jeśli nazwa parametru specjalnego args jest ostatnim elementem na liście argumentów, otrzymuje listę wszystkich argumentów w tym punkcie wiersza poleceń. Jeśli nie ma, lista jest pusta.

Nie może być argumenty, w tym opcjonalne, przed args :

proc myproc {alpha {beta {}} args} { ... }

Ta procedura zaakceptuje jeden lub więcej argumentów. Pierwsze dwa, jeśli są obecne, zostaną zużyte przez alpha i beta : lista pozostałych argumentów zostanie przypisana do args .

Procedura akceptująca nazwę / odwołanie do zmiennej

proc myproc {varName alpha beta} {
    upvar 1 $varName var
    set var [expr {$var * $alpha + $beta}]
}
set foo 1
myproc foo 10 5
puts $foo
# => 15

W tym konkretnym przypadku procedura otrzymuje nazwę zmiennej w bieżącym zakresie. Wewnątrz procedury Tcl takie zmienne nie są automatycznie widoczne, ale polecenie upvar może utworzyć alias dla zmiennej z innego poziomu stosu: 1 oznacza poziom stosu wywołującego, # 0 oznacza poziom globalny itp. W tym przypadku poziom stos 1 i nazwa foo (ze zmiennej parametru varName ) pozwala upvar znaleźć tę zmienną i utworzyć alias o nazwie var . Każda operacja odczytu lub zapisu na var zdarza się również foo na poziomie stosu wywołującego.

Składnia {*}

Czasami masz listę, ale polecenie, które chcesz przekazać elementy z listy, wymaga, aby każdy element był osobnym argumentem. Na przykład: winfo children zwraca listę okien, ale komenda destroy pobiera tylko sekwencję argumentów nazwy okna.

set alpha [winfo children .]
# => .a .b .c
destroy $alpha
# (no response, no windows are destroyed)

Rozwiązaniem jest użycie składni {*} :

destroy {*}[winfo children .]

lub

destroy {*}$alpha

Składnia {*} polega na przyjęciu następującej wartości (bez spacji!) I podzieleniu elementów tej wartości na wiersz poleceń, tak jakby były pojedynczymi argumentami.

Jeśli poniższa wartość jest pustą listą, nic nie jest łączone:

puts [list a b {*}{} c d]
# => a b c d

Jeśli jest jeden lub więcej elementów, są one wstawiane:

puts [list a b {*}{1 2 3} c d]
# => a b 1 2 3 c d


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow