2011.02.21 01:59 coś zwraca czy nie częścią sygnatury funkcji niechby było

Nie podoba mi się, że w prawie każdym języku muszę pamiętać, czy funkcja str_to_lower_case (albo analogiczna) zmienia ten napis czy też zwraca zmodyfikowaną kopię. Analogicznie z obcinaniem z napisu znaku końca linii, sortowaniem tablicy itp. Wolałbym żeby było tak. Jeśli napiszę "str_to_lower_case($a)", to niech $a zostanie zmodyfikowane. A jak napiszę "$b = str_to_lower_case($a)", to niech $a zostanie bez zmian, a do $b niech trafi kopia. I ogólniej: niech mogę napisać dwie funkcje różniące się tylko tym, że jedna coś zwraca, a druga nie. I niech w danej sytuacji będzie wywołana ta lub tamta w zależności od tego, czy ten, kto ją wywołuje, chce coś od niej dostać czy nie.

komentarze:
2011.02.21 02:26 marcin gryszkalis

W perlu jak najbardziej tak można

perl -E \'sub x2y { if (!defined wantarray) { say \"void\"; $_[0] =~ s/x/y/g; } else { say \"scalar\"; $n = shift; $n =~ s/x/y/g; return $n; } } $a = $b = \"axb\"; x2y($a); $c = x2y($b); print \"a($a)\\nb($b)\\nc($c)\\n\";\'

kontekst wywołania jest jedną z istotniejszych cech perla :)


2011.02.22 02:44 Cosi

Ja może trochę na inny temat, ale w Rubim funkcje, które zmieniają zawartość zmiennej wejściowej, kończą się wykrzyknikiem, np. sort(a) zwraca posortowaną tablicę a, a sort!(a) zwraca posortowaną tablicę, jednocześnie modyfikując zmienną a.
W Rubim Twój pomysł by się nie sprawdził, bo wywołanie funkcji bez \"=\" może być użyte jako odpowiednik \"return\":
def sortuj(a)
sort(a)
end




ksywa:

tu wpisz cyfrę cztery: (to takie zabezpieczenie antyspamowe)

komentarze wulgarne albo co mi się nie spodobają będę kasował


powrot na strone glowna

RSS