Lift's Boxを使用すると、 ( Full
ie Some
)、Empty
(ie None
) およびFailure
(anEmpty
が空であり、連鎖できる理由がある)を使用することでメリットが得られると思います。David Pollak は、それを紹介する優れたブログ投稿を持っています。要するに、次のようなことをするかもしれません (テストされていません):
def validate1: Box[String]
def validate2: Box[String]
def validate3: Box[String]
val validation = for (
validation1 <- validate1 ?~ "error message 1"
validation2 <- validate2 ?~ "error message 2"
validation3 <- validate3 ?~ "error message 3"
) yield "overall success message"
Full
これは元の例よりも短くはありませんが、私の意見では、 での検証が成功し、での検証が失敗した結果で、もう少し論理的Failure
です。
ただし、小さくすることはできます。まず、検証関数が returnBox[String]
であるため、それらは s 自体を返すことができ、自分自身に変換するFailure
必要はありません。Empty
Failure
val validation = for (
validation1 <- validate1
validation2 <- validate2
validation3 <- validate3
) yield "overall success message"
ただし、そうであれば同じものを返し、そうでなければ別のものを返すメソッドBox
もあります。これにより、次のようになります。or
Box
Full
Box
val 検証 = validate1 または validate2 または validate3
ただし、その行は、最初の失敗ではなく、最初の検証成功で停止します。必要なことを行う別のメソッドを作成することは理にかなっているかもしれませんが (おそらく と呼ばれunless
ますか?)、理解のためのアプローチよりもはるかに役立つとは言えません。
ただし、これを行う小さなライブラリの売春斡旋は次のとおりです。
scala> class Unless[T](a: Box[T]) {
| def unless(b: Box[T]) = {
| if (a.isEmpty) { a }
| else b
| }
| }
defined class Unless
scala> implicit def b2U[T](b: Box[T]): Unless[T] = new Unless(b)
b2U: [T](b: net.liftweb.common.Box[T])Unless[T]
scala> val a = Full("yes")
a: net.liftweb.common.Full[java.lang.String] = Full(yes)
scala> val b = Failure("no")
b: net.liftweb.common.Failure = Failure(no,Empty,Empty)
scala> val c = Full("yes2")
c: net.liftweb.common.Full[java.lang.String] = Full(yes2)
scala> a unless b
res1: net.liftweb.common.Box[java.lang.String] = Failure(no,Empty,Empty)
scala> a unless b unless c
res2: net.liftweb.common.Box[java.lang.String] = Failure(no,Empty,Empty)
scala> a unless c unless b
res3: net.liftweb.common.Box[java.lang.String] = Failure(no,Empty,Empty)
scala> a unless c
res4: net.liftweb.common.Box[java.lang.String] = Full(yes2)
これは、次のエラーでわかるように、Scala の型システムに関する私の限られた理解に基づく簡単なハックです。
scala> b unless a
<console>:13: error: type mismatch;
found : net.liftweb.common.Full[java.lang.String]
required: net.liftweb.common.Box[T]
b unless a
^
ただし、正しい軌道に乗るにはそれで十分なはずです。
もちろん、Lift ScalaDocsにはBoxに関する詳細情報があります。