Mein Modell sieht ungefähr so aus:Fall Class Konstruktorparameter als Tupel geben
abstract class A(id:String, val time:Int) extends Ordered[A]{
override def compare(that:TrackingEvent) = this.time.compare(that.time)
}
case class B(id:String, override val time: Int, x:Int, y:int) extends A(id,time) {
//some methods
}
// more Case Classes who inherit from A
ich einige Daten von einer mongodb und speichern sie in einigen Fall-Klassen (jede Klasse erbt von A)
Was ich im Moment tun, ist dies:
val header = getHeader(doc) //doc => actual row, return: Tuple2(String,Int)
val xy = getXYDatapoint(doc) // return: Tuple2(Int,Int)
val b = B(header._1,header._2,xy._1,xy._2)
Jede vererbte Fall Klasse die gleiche getHeader (doc) Funktion verwendet, um den Header zu bekommen. (Deshalb hat die abstrakte Klasse A die zwei Argumente)
Ich möchte, dass es schöner aussieht, damit ich einige Zeilen löschen kann.
Etwas wie:
val b = B(header+xy)
Oder sonst etwas. Ich kann den ganzen Scala-Code ändern und für jede Hilfe öffnen würde es schöner aussehen zu lassen (ich in Scala bin neu)
ich mit unförmigem versucht, aber das hat nicht funktioniert:
import shapeless._
import syntax.std.tuple._
val header = getHeader(doc)
val xy = getXY(doc)
val param = header++xy
val b = (B.apply _).tupled(param) // didn't work because param is of type prepend.Out
val b = (B.apply _).tupled(("a",2,3,4)) // would work
Wenn jemand kenne ein paar nette Tipps oder Tricks, die ich gerne hören würde. für den Fall, Klasse
Ich denke, dein zweiter Punkt ist wirklich interessant. Aber was ist, wenn Sie eine Klasse C haben, die ein Array nimmt, Klasse D, die 2 Strings braucht, ... würden Sie immer noch dasselbe tun? – Boendal
Es kommt immer auf den Anwendungsfall an. Haben Sie C, D usw., jedes mit verschiedenen Datentypen, aber alle repräsentieren Header, oder sind es eine Menge von 'id's und' time's kommen aus verschiedenen Sachen (nicht nur Header)? BTW lasst uns die Diskussion hier nicht überstrapazieren :) Wir haben das Hauptproblem gelöst (Fallklasse <-> Tupel). Ich habe Ihnen einen Hinweis zum Design gegeben, aber für weitere Fragen können wir uns immer auf gitter oder irgendwo treffen, oder Sie können eine Folgefrage stellen. – slouc
Wir können hier diskutieren, wenn Sie möchten: https://gitter.im/scala/scala – slouc