我目前有
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>
^
答案 0 :(得分:3)
以下是我的大脑如何解析错误信息......
error: overloaded method value ->
这是方法的名称,即' - &gt;'。
with alternatives
以下是 - &gt;的可能参数列表。在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],Text和Node
cannot be applied to (List[scala.xml.NodeSeq])
看起来List [NodeSeq]不是有效选项。
考虑到这一点,您可能希望从List中取出一个单独的NodeSeq,以便将其绑定到表单。你确定你真的想从helper方法返回一个List吗?
答案 1 :(得分: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>
}
}
作品。
答案 2 :(得分: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
答案 3 :(得分:1)
作为旁注,代码中有一件事不起作用:
case all: List[NodeSeq]
由于类型擦除,无法在运行时测试all
是否列出List[NodeSeq]
,List[String]
,List[AnyRef]
或你有什么。我很确定你必须在那条线上收到警告,并忽略它,因为你不明白它警告你的事情(至少,当我得到这样的警告时,发生在我身上的事情:)。正确的行是:
case all: List[_]
哪个会接受任何List
。如果你有兴趣的话,请查看关于类型擦除和Scala的问题以了解更多信息。