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>
                                                                  ^
War es hilfreich?

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 sein
cannot 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top