Refactoring val Methode führt zu Fehler bei der Kompilierung
-
19-09-2019 - |
Frage
Im Moment habe ich
def list(node: NodeSeq): NodeSeq = {
val all = Thing.findAll.flatMap({
thing => bind("thing", chooseTemplate("thing", "entry", node),
"desc" -> Text(thing.desc.is),
"creator" -> thing.creatorName.getOrElse("UNKNOWN"),
"delete" -> SHtml.link("/test", () => delete(thing), Text("delete"))
)
})
all match {
case Nil => <span>No things</span>
case _ => <ol>{bind("thing", node, "entry" -> all)}</ol>
}
}
, und ich versuchte, es zu
Refactoring def listItemHelper(node: NodeSeq): List[NodeSeq] = {
Thing.findAll.flatMap({
thing => bind("thing", chooseTemplate("thing", "entry", node),
"desc" -> Text(thing.desc.is),
"creator" -> thing.creatorName.getOrElse("UNKNOWN"),
"delete" -> SHtml.link("/test", () => delete(thing), Text("delete"))
)
})
}
def list(node: NodeSeq): NodeSeq = {
val all = listItemHelper(node)
all match {
case Nil => <span>No things</span>
case all: List[NodeSeq] => <ol>{bind("thing", node, "entry" -> all)}</ol>
case _ => <span>wtf</span>
}
}
, aber ich bekomme die folgende. Ich habe alle Rückgabetypen verfolgt und ich sehe nicht, wie mein Refactoring anders als das, was intern passiert wäre. Ich habe versucht, noch mehr Spiel Fall des Hinzufügen (wie Sie in dem Überarbeitete Code sehen), um sicherzustellen, war ich die richtige Art auswählen.
/Users/trenton/projects/sc2/supperclub/src/main/scala/com/runbam/snippet/Whyme.scala:37: error: overloaded method value -> with alternatives [T <: net.liftweb.util.Bindable](T with net.liftweb.util.Bindable)net.liftweb.util.Helpers.TheBindableBindParam[T] <and> (Boolean)net.liftweb.util.Helpers.BooleanBindParam <and> (Long)net.liftweb.util.Helpers.LongBindParam <and> (Int)net.liftweb.util.Helpers.IntBindParam <and> (Symbol)net.liftweb.util.Helpers.SymbolBindParam <and> (Option[scala.xml.NodeSeq])net.liftweb.util.Helpers.OptionBindParam <and> (net.liftweb.util.Box[scala.xml.NodeSeq])net.liftweb.util.Helpers.BoxBindParam <and> ((scala.xml.NodeSeq) => scala.xml.NodeSeq)net.liftweb.util.Helpers.FuncBindParam <and> (Seq[scala.xml.Node])net.liftweb.util.Helpers.TheBindParam <and> (scala.xml.Node)net.liftweb.util.Helpers.TheBindParam <and> (scala.xml.Text)net.liftweb.util.Helpers.TheBindParam <and> (scala.xml.NodeSeq)net.liftweb.util.Helpers.TheBindParam <and> (String)net.liftweb.util.Helpers.TheStrBindParam cannot be applied to (List[scala.xml.NodeSeq])
case all: List[NodeSeq] => <ol>{bind("thing", node, "entry" -> all)}</ol>
^
Lösung
Hier ist, wie mein Gehirn der Fehlermeldung analysiert ...
error: overloaded method value ->
Dies ist der Name des Verfahrens, das ist ‚->‘.
with alternatives
Was folgt ist die Liste der möglichen Parameter für -> in der Funktion bind ().
[T <: net.liftweb.util.Bindable](T with net.liftweb.util.Bindable)net.liftweb.util.Helpers.TheBindableBindParam[T]
Diese besagt, dass alles, was Geräte oder das Merkmal Bindable umfasst faires Spiel ist.
<and> (Boolean)net.liftweb.util.Helpers.BooleanBindParam
<and> (Long)net.liftweb.util.Helpers.LongBindParam
<and> (Int)net.liftweb.util.Helpers.IntBindParam
<and> (Symbol)net.liftweb.util.Helpers.SymbolBindParam
<and> (Option[scala.xml.NodeSeq])net.liftweb.util.Helpers.OptionBindParam
<and> (net.liftweb.util.Box[scala.xml.NodeSeq])net.liftweb.util.Helpers.BoxBindParam
Bündel typspezifischen Optionen.
<and> ((scala.xml.NodeSeq) => scala.xml.NodeSeq)net.liftweb.util.Helpers.FuncBindParam
<and> (Seq[scala.xml.Node])net.liftweb.util.Helpers.TheBindParam
<and> (scala.xml.Node)net.liftweb.util.Helpers.TheBindParam
<and> (scala.xml.Text)net.liftweb.util.Helpers.TheBindParam
<and> (scala.xml.NodeSeq)net.liftweb.util.Helpers.TheBindParam
<and> (String)net.liftweb.util.Helpers.TheStrBindParam
Ah! Node-verwandte Themen. Unsere gültigen Optionen scheinen NodeSeq, Seq [Knoten], Text und Knoten
zu seincannot be applied to (List[scala.xml.NodeSeq])
Sieht aus wie List [NodeSeq] ist keine gültige Option.
In diesem Sinne, möchten Sie wahrscheinlich eine individuelle NodeSeq aus der Liste nehmen, um es in die Form zu binden. Sind Sie sicher, dass Sie eine Liste der Hilfsmethode wirklich zurückkehren wollen?
Andere Tipps
Ich konnte nicht erkennen, dass NodeSeq erstreckt Seq [Knoten], so dass ich den falschen Rückgabetyp auf der extrahierten Methode hatte. Ändern es zu
def listItemHelper(node: NodeSeq): NodeSeq = {
Thing.findAll.flatMap({
thing => bind("thing", chooseTemplate("thing", "entry", node),
"desc" -> Text(thing.desc.is),
"creator" -> thing.creatorName.getOrElse("UNKNOWN"),
"delete" -> SHtml.link("/test", () => delete(thing), Text("delete"))
)
})
}
def list(node: NodeSeq): NodeSeq = {
val all = listItemHelper(node)
all.length match {
case 0 => <span>No things</span>
case _ => <ol>{bind("thing", node, "entry" -> all)}</ol>
}
}
funktioniert.
Ein Problem ist, dass Ihr Spiel wirklich keinen Sinn machen: im Grunde Sie passen entweder gegen eine leere Liste oder eine nicht-leere Liste. Es gibt keine andere Möglichkeit:
all match {
case Nil => //if list is empty
case nonEmptyList => //if list is not empty
}
Natürlich können Sie auch tun:
case Nil =>
case x :: Nil => //list with only a head
case x :: xs => //head :: tail
Als Randbemerkung, es ist eine Sache in Ihrem Code, der nicht funktioniert:
case all: List[NodeSeq]
Durch Typen Löschung , gibt es keine Möglichkeit zu testen, zur Laufzeit, ob all
Liste eines List[NodeSeq]
, List[String]
, List[AnyRef]
oder was-haben-Sie. Ich bin ziemlich sicher, müssen Sie auf dieser Linie eine Warnung bekommen, und ihn zu ignorieren, weil Sie nicht verstehen, was es über Sie warnt (zumindest, dass das, was mir passiert ist, wenn ich eine solche Warnung :) bekam. Die richtige Linie wäre:
case all: List[_]
, die jede Art von List
akzeptieren würde. Sehen Sie eine Frage von mir auf Typ Löschung und Scala ein bisschen mehr zu sehen, wenn Sie interessiert sind.