Domanda

Al momento ho

  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>
    }
  }

e ho cercato di refactoring per

  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>
    }
  }

, ma ottengo il seguente. Ho rintracciato tutti i tipi di ritorno e non vedo come il mio refactoring è diverso rispetto a quello che stia accadendo internamente. Ho anche provato ad aggiungere più casi di corrispondenza (come si può vedere nel codice refactoring) per assicurarsi che stavo selezionando il tipo giusto.

/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>
                                                                  ^
È stato utile?

Soluzione

Ecco come il mio cervello analizzato il messaggio di errore ...

error: overloaded method value ->

Questo è il nome del metodo, che è '->'.

with alternatives 

Che seguirà l'elenco dei possibili parametri per -> all'interno della funzione bind ().

[T <: net.liftweb.util.Bindable](T with net.liftweb.util.Bindable)net.liftweb.util.Helpers.TheBindableBindParam[T] 

Questo dice che tutto ciò che implementa o comprende il tratto Bindable è un gioco equo.

<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 

Mazzo di opzioni specifiche.

<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! Nodo legati roba. Le nostre opzioni valide sembrano essere NodeSeq, Seq [Node], testo, e il nodo

cannot be applied to (List[scala.xml.NodeSeq])

appare come Lista [NodeSeq] non è un'opzione valida.

Con questo in mente, probabilmente avrete bisogno di prendere un NodeSeq individuale fuori dalla lista per associarlo al modulo. Sei sicuro di voler restituire un elenco dal metodo di supporto?

Altri suggerimenti

Non sono riuscito a vedere che si estende NodeSeq Seq [Node], così ho avuto il tipo di ritorno sbagliato sul metodo estratto. La modifica a

  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>
    }
  }

opere.

Un problema è che il tuo partner in realtà non ha alcun senso: in pratica si sono corrispondenti contro sia un elenco vuoto o di una lista non vuota. Non c'è altra possibilità:

all match {
  case Nil          =>  //if list is empty
  case nonEmptyList =>  //if list is not empty
}

Naturalmente si potrebbe anche fare:

case Nil       =>
case x :: Nil  => //list with only a head
case x :: xs   => //head :: tail

Come nota a margine, c'è una cosa che nel codice che non funziona:

case all: List[NodeSeq]

A causa di la cancellazione di tipo , non c'è modo di verificare, in fase di esecuzione, se all elencare una List[NodeSeq], List[String], List[AnyRef] o quello che-hanno-te. Sono abbastanza sicuro che deve essere sempre un avvertimento su quella linea, e ignorando, perché non si capisce che cosa sta avvertendo circa (almeno, questo è quello che è successo a me quando ho ottenuto tale avvertimento :). La linea corretta sarebbe:

case all: List[_]

Il che accettare qualsiasi tipo di List. Cercare una mia domanda sul tipo di cancellazione e la Scala di vedere un po 'più su di esso, se siete interessati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top