Thread Kontextabhängiges Verhalten von Funktionen (4 answers)
Opened by Kuerbis at 2022-07-28 09:59

haj
 2022-07-28 15:20
#194420 #194420
User since
2015-01-07
527 Artikel
BenutzerIn

user image
2022-07-28T07:59:41 Kuerbis
Ist kontextabhängiges Verhalten von Funktionen böse?

"Böse"? Nein. Mit Vorsicht zu geniessen: Ja.

Das Problem an wantarray ist: Es gibt keinen "Array Kontext", sondern einen Listen-Kontext. Die Funktion heißt aber nicht wantlist, und ob der Programmierer ein Array will, ist damit gar nicht ausgedrückt. Auch in dem Artikel geht es um den etwas trickreichen Unterschied zwischen einer Liste und einem Array.

Ein ganz typischer Fehler ist:
Code (perl): (dl )
1
2
3
4
5
6
sub f { 
    return wantarray 
        ? (qw/L i s t e/) 
        : 'Skalar'; 
}
my %hash = ( key => f() );

Bei der Erstellung von %hash will man definitiv kein Array. Perl ist bei der Zuweisung aber im Listen-Kontext, und so entsteht hier ein Hash mit den Schlüsseln key, i und t.

Meine Empfehlung ist: Wann immer eine Funktion mehrere Werte zurückgeben kann, soll sie das klar und deutlich beschreiben, und auch, was in skalarem Kontext passiert. Das hat mit wantarray nichts zu tun.

In Deinem Fall fungiert der Kontext als Input für Deine Funktion. Als Alternativen ohne wantarray könntest Du entweder zwei Routinen choose_single und choose_multiple oder einen zusätzlichen Parameter anbieten. Auch dann musst Du definieren, was zurückkommt, falls jemand choose_multiple in skalarem Kontext aufruft. Ist das dann besser? Meiner Meinung nach: nein.

Als Anwender von choose muss ich mir sowieso überlegen, ob ich einen oder mehrere Werte zulassen will. Wenn ich das dadurch zum Ausdruck bringen kann, dass ich in einen Skalar oder ein Array zuweise, dann ist das für mich DWIM im positivien Sinn!

Die CPAN:Perl::Critic Policy ist ein bisschen neben der Spur. Dass Funktionen Listen zurückgeben können, und dass sie wahlweise in skalarem oder Listen-Kontext aufgerufen werden können, hat mit wantarray nichts zu tun. Wer wantarray verwendet, ist sich dieser Tatsache zumindest bewusst!

View full thread Kontextabhängiges Verhalten von Funktionen