質問

を作って小さな発行管理システムリフトの両方を学ぶScala、滑りやすいコンディション!

いビューを表示する一つの課題に属する。以前はbindデータのテンプレートに付いているかどうか確かめたいとすべてのデータを要求していきたいなと思っています具体的には確認:

  • プロジェクトID param品を提供してい
  • プロジェクトが存在する付属のプロジェクトID
  • 課題ID param品を提供してい
  • 問題が存在する付属の課題ID

これらの点を評価する必要があり、順番になったので書いて現在の私の理解Scala、私は次のように処理されます:

class Project {
    def findByID(xhtml:NodeSeq): NodeSeq = 
        param("projectID") match {
            case Full(projectID) =>
                Project.findByID(projectID) match {
                    case Full(projectID) =>
                        param("issueID") match {
                            ....
                        }
                    case _ => Text("Project does not exist")
                }
            case _ => Text("projectIDNotSupplied")
        }
}

さんの疑問があれば容易に行う。ると考えてい表現を実行することができものです。このプロジェクト.findByIDを返しますボックス"プロジェクト".

役に立ちましたか?

解決

申し訳ありませんが、私はそう遅くショーにだけど、ダニエルが言うように、あなたが実際にリフトのボックスとを使用することができますか?〜このような何かをします。たとえばます:

import net.liftweb.util.Box
import net.liftweb.util.Box._

class Project {
  def findByID(xhtml:NodeSeq): NodeSeq = 
    (for {
      projectID <- param("projectID") ?~ "projectIDNotSupplied"
      project <- Project.findById(projectID) ?~ "Project does not exist"
      issueID <- param("issueID") ?~ "issueIDNotSupplied"
      ...
    } yield {
      ...
    }) match {
      case Full(n) => n
      case Failure(msg, _, _) => Text(msg)
      case _ => Text("fail")
    }
}

何?〜ん、指定したStringエラーメッセージで失敗ボックスに空のボックスをオンにしているが、完全(成功)ボックスに何もしません。すべてがそうでない場合は(特定のエラーメッセージが表示されて)成功、または失敗のであればfindByIDの戻り値は完全になります。あなたがチェーンに失敗をしたい場合は、その後、でしょう?〜!その代わります。

他のヒント

私はリフトを知らないが、私はそれの実装で見てきたものがいくつかあります。 ?~?~!:そのうちの一つは、障害方法です。私は1つは、それらを使用して行くかもしれない正確にどのようにわからないんだけど、有用であると思われます。もう一つは、例外をスローするように、open_!です。

さて、それは完全に理解するために内部で使用できるようにボックスのサポートマップ、flatMap、フィルタとforeachの、ます:

for(projectID <- param("projectID");
    if Project.findByID(projectID).isDefined;
    issueID <- param("issueID");
    if Issue.findByID(issueID).isDefined)
yield ...

これは、あなたのエラーメッセージを取得することはできません。人のために、私は答えを提供し、~>のような私が述べた方法、または他者の可能性が推測してます。

わからないのリフトだったので答えない他のリフト-特定の質問をします。かったのでした解決方法の一つ一つの問題は書き方のシーケンスチェックしての操作ョンに先進的な入れ子のパターンマッチングです。

本データ型にはこちらをご利用はオプションも思いますので非常に容易に対応。何を達成したいここではのシーケンス

  1. チェック条件
  2. 継続に成功した場合は
  3. 終了およびあな

このコードなどの回路まで出なしでの返り値が保存される配列の行動します。利用開始オプションを書き、"ifSome"の場合のオプションは一部および"ifNone"の場合のオプションは無し、またはシーケンスが終了しました。場合にはNoneとの出会いのいずれの配列を、オプションから返された呼び名前のパラメータの"isNone"を保および返却時の最終"toOption"が呼び出されます。"利用toOption"の実際のオプション結果です。

チェックの例は、"本体"の一部の利用例です。幸運を祈っています。

object Options {

  class RichOption[A](a: Option[A]) {

    def ifSome[B](f: A => Option[B]): RichOption[B] = a match {
      case Some(x) => new RichOption(f(x))
      case None => this.asInstanceOf[RichOption[B]]
    }

    def ifNone[B](f: => Option[B]): RichOption[B] = a match {
      case Some(_) => this.asInstanceOf[RichOption[B]]
      case None => new RichNone(f)
    }

    def toOption[A] = a
  }

  class RichNone[A](a: Option[A]) extends RichOption[A](a) {

    override def ifSome[B](f: A => Option[B]): RichOption[B] = this.asInstanceOf[RichOption[B]]

    override def ifNone[B](f: => Option[B]): RichOption[B] = this.asInstanceOf[RichOption[B]]
  }

  implicit def option2RichOption[A](a: Option[A]): RichOption[A] = new RichOption(a)

  def main(args: Array[String]) {
    println(Some("hello") ifSome(s => Some(s.toUpperCase)) toOption) // prints Some(HELLO)
    println(Some("hello") ifNone(Some("empty")) toOption) // prints Some(hello)
    println(Some("hello") ifSome(s => Some(s.toUpperCase)) ifNone(Some("empty")) toOption) // prints Some(HELLO)
    println(Some("hello") ifNone(Some("empty")) ifSome(s => Some(s.toUpperCase)) toOption) // prints Some(HELLO)
    println((None: Option[String]) ifSome(s => Some(s.toUpperCase)) toOption) // prints None
    println((None: Option[String]) ifNone(Some("empty")) toOption) // prints Some(empty)
    println((None: Option[String]) ifSome(s => Some(s.toUpperCase)) ifNone(Some("empty")) toOption) // prints Some(empty)
    println((None: Option[String]) ifNone(Some("empty")) ifSome(s => Some(s.toUpperCase)) toOption) // prints Some(empty)
    println(Some("hello world") ifSome(s => Some(s.toUpperCase)) ifNone(Some("empty")) ifSome(s => Some(s.length)) ifNone(None) toOption) // prints Some(11)
    println(Some("hello world") ifSome(_ => None) ifNone(Some("goodbye world")) ifSome(s => Some(s.length)) ifNone(None) toOption) // prints Some(goodbye world)
    println((None: Option[String]) ifSome(s => Some(s.toUpperCase)) ifNone(Some("empty")) ifSome(s => Some(s.length)) ifNone(None) toOption) // prints Some(empty)
    println((None: Option[String]) ifSome(_ => None) ifNone(Some("goodbye world")) ifSome(s => Some(s.length)) ifNone(None) toOption) // prints Some(goodbye world)
  }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top