Scala: Merkmal für ein Funktionsobjekt mit variablen Längenargumenten?

Ich schreibe einige Scala-Code, um einen Python-Dekorator zu emulieren. Ich erwäge, dies zu implementieren, indem ich den Dekorateur ein Funktionsmerkmal verlängere. Das Problem ist, dass ich möchte, dass dieser Dekorateur eine Funktion erweitert, die eine beliebige Anzahl von Argumenten akzeptiert, und die einzigen Funktionsmerkmale, die ich finden kann, erlauben nur eine bestimmte Anzahl von Argumenten, zB Function1, Function2, etc.

Ist ein solches Merkmal vorhanden? Alternativ gibt es einen besseren Weg, um einen solchen Dekorateur zu implementieren?

Edit: Ich rekapituliere diese Frage, um bei scala klarer zu sein : Memoize eine Funktion, egal wie viele Argumente die Funktion dauert? .

3 Solutions collect form web for “Scala: Merkmal für ein Funktionsobjekt mit variablen Längenargumenten?”

scala> val bar: (Int*) => Int = {args => args.sum} bar: (Int*) => Int = <function1> scala> bar(1,2,3) res4: Int = 6 

Leider können Sie hier keine Typ-Inferenz verwenden:

 scala> val bar = {args: Int* => args.sum} <console>:1: error: ';' expected but identifier found. val bar = {args: Int* => args.sum} 

Ich bin mir nicht sicher, was Sie versuchen zu erreichen, aber wenn Sie Probleme mit der Arity von Funktionen haben, können Sie an einer Funktion1 arbeiten, die ein Tupel als Eingabeparameter verwendet. Da es einfach ist, zwischen tupled und untuples Versionen für jede Funktion zu konvertieren, sollte dies nicht zu unbequem sein. Ich könnte Ihnen ein Codebeispiel geben, wenn Sie detaillierter beschreiben würden, was Sie brauchen.

Es gibt keine Funktion supertrait. Du musst die Methode, die du in eine eigene Klasse verzieren willst, mit einem Implizit einpacken. Diese Klasse muss die verschiedenen Methodenarten behandeln. Dann musst du irgendeine Klasse schaffen, was deine dekorierte Methode erzeugt.

Oder wenn du kannst so einfach neue Methoden erstellen:

 def myF(x:Int,y:Int)={x*y} def myF2(x:Int,y:Int)={myDecorator(myF(x,y))} def myDecorator[X](f:=>X)={println("entering");val ret=f();println("exiting");ret} 

Oder versuchen:

 def myF_old(x:Int,y:Int)=x*y def paramDecorator(x:Any*):List[Any]={/*do some match operations or something*/} def outputDecorator(x:Any*):Any={/*do some match operations or so*/} def myF(x:Int,y:Int):Int={ params=paramDecorator(x,y); val res=myF_old(params(1),params(2)); outputDecorator(res); } 
  • Eine Liste oder Karte als Funktionsargumente in Scala einpacken
  • Was bedeutet dieser Fehler (SimpleHttpConnectionManager wird falsch verwendet)?
  • Filter auf der Grundlage einer anderen RDD in Spark
  • Was ist der bevorzugte Weg, um 'Ertrag' in Scala zu implementieren?
  • Interpretation einer Benchmark in C, Clojure, Python, Ruby, Scala und andere
  • Funkenleistung für Scala vs Python
  • Python-Äquivalent von Scala's existiert () Funktion?
  • Wenn du Python als Unterprozeß anrufst, kann ich es zwingen, im interaktiven Modus zu laufen?
  • Spark: Wie komme ich Python mit Scala oder Java User Defined Functions?
  • Python: Umleitung des Teilprozesses Popen stdout zur Protokolldatei
  • Wie man eine Textdatei in mehrere Spalten mit Spark aufteilt
  • Python ist die beste Programmiersprache der Welt.