2009-11-13 1 views
0

я в настоящее времяРефакторинг вала результатов методы в компиляции ошибке

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

, и я попытался реорганизовать его

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

, но я получаю следующее. Я отслеживал все типы возвращаемых данных, и я не вижу, как мой рефакторинг отличается от того, что происходит внутри. Я даже попытался добавить больше случаев совпадения (как вы можете видеть в обновленном коде), чтобы убедиться, что я выбираю правильный тип.

/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> 
                   ^

ответ

3

Вот как мой мозг разобрали сообщение об ошибке ...

error: overloaded method value -> 

Это имя метод, который является «->».

with alternatives 

Ниже приведен список возможных параметров для -> в функции bind().

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

Это говорит о том, что все, что реализует или включает в себя признак Bindable, является честной игрой.

<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 

Ах! Связанный с узлом материал. Наши действительные варианты кажутся NodeSeq, Seq [Node], текст, и узел

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

Похоже List [NodeSeq] не является допустимым параметром.

Имея это в виду, вы, вероятно, захотите перенести отдельный список NodeSeq из списка, чтобы привязать его к форме. Вы действительно хотите вернуть список из вспомогательного метода?

1

мне не удалось видеть, что NodeSeq расширяет Seq [Node], так что я был неправильный тип возвращаемого на выведенном методе. Изменение его на

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

Работы.

1

Одна из проблем заключается в том, что ваш матч на самом деле не имеет никакого смысла: в основном вы сопоставляетесь либо с пустым списком, либо с непустым списком. Там нет никакой другой возможности:

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

Конечно, вы также можете сделать:

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

Как примечание стороны, есть одна вещь в вашем коде, который не работает:

case all: List[NodeSeq] 

Из типа стирания, нет никакого способа, чтобы проверить, во время выполнения, будь то all Сдать List[NodeSeq], List[String], List[AnyRef] или что-то-вы.Я уверен, что вы должны получать предупреждение на этой линии и игнорировать его, потому что вы не понимаете, о чем это вас предупреждает (по крайней мере, это случилось со мной, когда я получил такое предупреждение :). Правильная линия будет:

case all: List[_] 

Что бы принять любой вид List. Посмотрите на мой вопрос о стирании стилей и Scala, чтобы узнать об этом немного больше, если вам интересно.

+0

Ранее была ошибка компиляции, поэтому предупреждение b/c этого не было. – Trenton

 Смежные вопросы

  • Нет связанных вопросов^_^