Wartości domyślne i zmienna liczba argumentów

<< Kliknij, aby wyświetlić Spis treści >>

Nawigacja:  Dodatki > TCL > Procedury >

Wartości domyślne i zmienna liczba argumentów

Lista argumentów procedury może być pusta, w takim przypadku procedura nie pobiera argumentów:

proc printVars {} {

        global a b

        puts "a jest $a, b jest $b"

    }

Można ustawiać wartości domyślne jednego lub wszystkich argumentów. Lista argumentów jest właściwie listą list, gdzie każda podlista odpowiada jednemu argumentowi. Jeśli podlista zawiera tylko jeden element, to jest on nazwą argumentu. Jeżeli jednak podlista posiada drugi element, to staje się on wartością domyślną argumentu:

proc inc {value {increment 1}} {

        expr $value+$increment

    }

Pierwszy argument na liście argumentów, value, posiada określoną tylko nazwę. Drugi argument, increment, posiada również wartość domyślną równą 1. Oznacza to, że polecenie inc może być wywołane z jednym lub z dwoma argumentami:

inc 42 3

     45

    inc 42

     43

Argumenty domyślne, jeśli występują, muszą występować na końcu listu argumentów. Jeśli zostanie podana wartość domyślna danego argumentu, to wszystkie argumenty występujące dalej na liści również muszą posiadać wartości domyślne. Podobnie, jeśli któryś z argumentów zostanie pominięty podczas wywołania polecenia, wszystkie dalsze na liście argumenty również muszą zostać pominięte.

Procedura może posiadać zmienną liczbę argumentów. Jeśli ostatni argument na liście posiada specjalną nazwę args, to procedura może być wywoływana ze zmienną liczbą argumentów. Argumenty poprzedzające na liście args są obsługiwane normalnie, ale dalej można użyć dowolnej liczby argumentów. Pod lokalną zmienną args w procedurze zostanie podstawiona lista wszystkich dodatkowych argumentów. Jeśli dodatkowe argumenty nie zostaną podane, args stanie się pustym napisem. Poniższy przykład pobiera dowolną liczbę argumentów i zwraca ich sumę:

proc sum args {

        set s 0

        foreach i $args {

            incr s $i

        }

    return $s

    }

    sum 1 2 3 4 5

     15

    sum

     0