refactoring val에서 방법으로 컴파일 타임 오류가 발생합니다
-
19-09-2019 - |
문제
나는 현재 가지고있다
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>
^
해결책
내 뇌가 오류 메시지를 어떻게 정리했는지는 다음과 같습니다.
error: overloaded method value ->
이것이 '->'인 메소드의 이름입니다.
with alternatives
다음은 bind () 함수 내에서 ->에 대한 가능한 매개 변수 목록입니다.
[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
아! 노드 관련 물건. 우리의 유효한 옵션은 Nodeseq, seq [노드], 텍스트 및 노드 인 것 같습니다.
cannot be applied to (List[scala.xml.NodeSeq])
List [NODESEQ]는 유효한 옵션이 아닌 것 같습니다.
이것을 염두에두고, 당신은 아마도 양식에 바인딩하기 위해 개별 Nodeseq를 목록에서 꺼내고 싶을 것입니다. 헬퍼 방법에서 목록을 반환하고 싶습니까?
다른 팁
NODESEQ가 SEQ [노드]를 연장하는 것을 보지 못했기 때문에 추출 된 방법에 잘못된 리턴 유형이있었습니다. 변경
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>
}
}
공장.
한 가지 문제는 성냥이 실제로 의미가 없다는 것입니다. 기본적으로 빈 목록이나 비어 있지 않은 목록과 일치합니다. 다른 가능성은 없습니다.
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
참고로 코드에는 작동하지 않는 한 가지가 있습니다.
case all: List[NodeSeq]
때문에 삭제를 입력하십시오, 런타임에 테스트 할 방법이 없습니다. all
목록 a List[NodeSeq]
, List[String]
, List[AnyRef]
또는 당신은 무엇을하셨습니다. 나는 당신이 그 라인에서 경고를 받고 있어야한다고 확신하고, 당신이 그것이 당신에 대한 경고가 무엇인지 이해하지 못하기 때문에 그것을 무시해야한다고 확신합니다. 올바른 선은 다음과 같습니다.
case all: List[_]
어떤 종류의 모든 종류를 받아 들일 것입니다 List
. 관심이 있으시면 유형 삭제와 스칼라에 대한 내 질문을 찾아보십시오.