문제

나는 현재 가지고있다

  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. 관심이 있으시면 유형 삭제와 스칼라에 대한 내 질문을 찾아보십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top