Ich komme von Groovy und es gibt eine .with
-Methode für jeden Typ, der eine Schließung mit einem Argument akzeptiert; Das Argument ist das Objekt, auf dem die Methode .with
aufgerufen wird. Dies ermöglicht eine sehr coole Technik der Erweiterung der funktionalen Verkettungsfähigkeiten, die Sie von der Verpflichtung entbindet, temporäre Variablen einzuführen, Ihren Code zu beeinflussen, es leichter lesbar macht und andere Feinheiten macht.
Ich möchte in der Lage sein, so etwas zu tun:
%Vor%Anstelle von
%Vor% Mit anderen Worten, im ersten Beispiel ist .with
ähnlich wie .foreach
, aber anstatt die Elemente des Objekts zu durchlaufen, wird es einmal für das Objekt selbst aufgerufen. Also it
ist gleich Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
.
Da ich sehr überrascht war, so etwas in Scala nicht zu finden, sind meine Fragen:
Aktualisierung: Eine entsprechende Feature-Anfrage wurde im Scala-Issue-Tracker veröffentlicht: Ссылка . Bitte stimme und fördere
Es gibt keine solche Methode in der Standardbibliothek, aber es ist nicht schwer, Ihre eigene zu definieren.
%Vor%BEARBEITEN: (als Antwort auf den Kommentar)
Oh, ich habe es falsch verstanden. Was Sie brauchen, ist in der Scalaz-Bibliothek. Es kommt unter dem Namen |>
(bezeichnet als Pipe-Operator). Damit würde Ihr Beispiel wie folgt aussehen:
Wenn Sie Scalaz nicht verwenden können, können Sie den Operator selbst definieren:
%Vor%Und es ist keine schlechte Übung, nützliche Methoden für existierende Typen zu pimpen. Sie sollten implizite Konvertierungen sparsam verwenden, aber ich denke, dass diese beiden Kombinatoren genug sind, damit ihre Zuhälter vertretbar sind.
Es gibt eine Syntax für dieses Muster in Scala:
%Vor%Allerdings ist dies kein akzeptiertes Idiom, also sollten Sie es vielleicht (ab) nicht benutzen.
Wenn Sie nicht mögen, Lasten und viele Namen für Dummy-Variablen zu erfinden, denken Sie daran, dass Sie Rahmenstreben verwenden können:
%Vor%Versuchen Sie es so.
%Vor%Führt eine Assertionsausnahme aus, wenn die Bedingung nicht erfüllt ist.
Anrufen nach Name? Vielleicht gibt es Ihnen die Fähigkeit, die Sie wollen:
%Vor%wie in Ссылка
beschriebenObwohl ich andere Lösungen besser mag (da sie eher lokal sind und daher einfacher zu folgen sind), vergiss nicht, dass du es tun kannst
%Vor%Um Namenskollisionen auf Ihren bedeutungslosen Variablen zu vermeiden und sie auf den entsprechenden Bereich beschränkt zu halten.
Dies ist nur die Funktion application f(x)
, die auf den Kopf gestellt wurde: x.with(f)
... Wenn du nach einer idiomatischen Methode suchst with
in Scala zu machen, entferne es:
Wenn Sie x.with(f).with(g)
verwenden möchten, verwenden Sie einfach g(f(x))
...
Tags und Links scala