Egy metódusnak kötelezően van neve,
argumentuma(i),
visszatérési típusa. Tehát minden
metódus gyakorlatilag függvény, mint a C-ben.
Az alprogram neve állhat több
részből is, de minden
rész után kell paraméternek állnia.
Például a következő eljárás neve
multiply by
:
int multiply a by int b;
{
return a * b;
}
Ennek az eljárásnak két paramétere
van, két int típus és a visszatérési
típusa is int. A két
paraméter szorzatával tér vissza.
A következő program az eljárás
működését szemlélteti:
int main Array argv
{
int i, n = [argv length], result = 1;
for (i = 0; i < }; i++)
{
String s = [argv at i];
result = [self multiply result by [s intValue]];
}
[[[stdio out] print result] nl];
return 0;
}
Tuple-k
Azokban az
esetekben, amikor egy metódusnak több
visszatérési értéke van, a
TOM nyelv a tuple használatát kínálja. Egy
példa egy metódusra, ami tuple-t
használ a substring
metódus a String
osztályból.
String substring (int, int) (start, length);
Ennek a metódusnak a (start,
length)
tuple az argumentuma.
A következő példa szemléltet
működés
közben egy futó szöveget.
int main Array argv
{
String text = "Testing... 1 2 3", spaces = " ";
int len = [spaces length], finish = len + [text length];
int num = (![argv length] ? 100 : [argv[0] intValue]);
int i, count;
for (count = 0; count < num; count++)
for (i = 0; i < finish; i++)
{
if (i < len)
{
/*
1. eset: Space-ek utan a szoveg eleje. */
[out print [spaces substring (0, len - i)]];
[out print [text substring (0, i)]];
else if (i < finish - len)
/*
2. eset: Kezdi es befejezi a sort a szovegben. */
[out print [text substring (i - len, len)]];
}
else
{
/*
3. eset: Szoveget koveto space-ek. */
[out print [text substring (i - len, finish - i)]];
[out print [spaces substring (0, len - (finish - i))]];
}
/* Visszamegy a sor elejere. */
[out print '\r'];
}
= 0;
}
Egy példa tuple-t
visszaadó
metódus az Enumerator
. Egy Enumerator
használható
arra, hogy megfordítsa az objektumok sorrendjét. Az enumerator
gyűjteményének
bekérése után a metódus
(boolean, Any)
next;
használható arra, hogy
ismétlődően helyrerakja
a következő objektumot. A next
által
visszaadott érték egy tuple egy boolean
–al
és egy objektummal. Ha a boolean TRUE
,
a
tuple második eleme tartalmazza a keresett objektumot. Ha FALSE
,
akkor a
gyűjtemény végére értünk.
int main Array argv
{
Enumerator e = [argv enumerator];
Any object;
while ({
boolean valid;
(valid, object) = [e next];
valid;
})
[[[stdio out] print ("got one: `", object, '\'')] nl];
return 0;
}
Visszatérési
értékek
Az eddigi példákban a „return
”
utasítással adtuk meg az alprogram
visszatérési értékét. Ezzel a
metódus futása is befejeződik, akárcsak C-ben. Pl:
{
...
int result = [self computation];
[self deallocateResources];
return result;
}
Van más mód is a visszatérési
érték megadására. Baloldal
nélküli
értékadással beállíthatjuk az
alprogram visszatérési
értékét, anélkül, hogy a futása
befejeződne. Pl.:
{
…
= [self computation];
[self deallocateResources];
}
Ha egy alprogramban nem adunk meg
visszatérési
értéket, akkor automatikusan a visszatérési
típus alapértelmezett értékével
tér
vissza. Például a két program ekvivalens:
boolean constantp
{
boolean v;
= v;
}
boolean constantp
{
}
Tuple típusoknál a
visszatérési értéket
alapesetben minden mezőre meg kell adni. Pl.:
{
…
= (a, b);
…
}
Ezt elkerülendő, lehet alkalmazni névvel ellátott
visszatérési típusokat.
Ilyenkor a visszatérési értéket úgy
lehet kezelni, mint egy lokális változót. A
nevet mindenképp zárójelbe kell tenni. Ha csak egy
változó a visszatérési
érték, akkor úgynevezett „
singleton
tuple
” –ként kell megadni a nevet.
Pl.:
(bool, Any) (valid, object) next
}
valid = [self haveMoreObjects];
if (valid)
object = [self getNextObject];
}
Ha a visszatérési érték és a
paraméterek nevei között átfedés van,
akkor
gyakorlatilag eredmény szerinti
paraméter-átadást alkalmaz a nyelv. Azaz a
paraméterként kapott változó, mint
lokális változó szerepel az alprogram
törzsében. Majd a visszatérési
érték
automatikusan a változó értéke lesz. Pl.:
int (value) echo int value
{
}
Ez az eljárás semmi mást nem csinál, csak a
paraméterként kapott int típusú
váltózó értékével tér
vissza.