. mit Alternative in Scala

7

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:

  • vermisse ich etwas?
  • Gibt es alternative Techniken in Scala?
  • Wenn nicht, gibt es irgendwelche vernünftigen Gründe, warum diese Funktion in Scala nicht implementiert ist?

Aktualisierung: Eine entsprechende Feature-Anfrage wurde im Scala-Issue-Tracker veröffentlicht: Ссылка . Bitte stimme und fördere

    
Nikita Volkov 16.12.2011, 17:37
quelle

6 Antworten

12

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:

%Vor%

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.

    
missingfaktor 16.12.2011, 18:06
quelle
7

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%     
Debilski 16.12.2011 19:58
quelle
3

Versuchen Sie es so.

%Vor%

Führt eine Assertionsausnahme aus, wenn die Bedingung nicht erfüllt ist.

    
agilesteel 16.12.2011 17:58
quelle
1

Anrufen nach Name? Vielleicht gibt es Ihnen die Fähigkeit, die Sie wollen:

%Vor%

wie in Ссылка

beschrieben     
mozillanerd 16.12.2011 17:55
quelle
1

Obwohl 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.

    
Rex Kerr 16.12.2011 20:16
quelle
1

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:

%Vor%

Wenn Sie x.with(f).with(g) verwenden möchten, verwenden Sie einfach g(f(x)) ...

    
mergeconflict 16.12.2011 21:54
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '413159',
    'url' => 'with-alternative-in-scala',
];

$_SESSION = [
    '__flash' => [],
];