実際問題として、私はこの問題を抱えたことは一度もなく、ばかげた間違いをたくさんします。あなたは、else ステートメントをスキップしないことを完全に学習できると思います。(中括弧は何の役にも立たないことに注意してください。中括弧はスキップできますelse
。)
これが本当に問題だと思う場合は、次のmatch
ステートメントを悪用することができます。
true match {
case _ if f1(bar) => 0
case _ if f2(bar) => 1
case _ => -1
}
これにより、間違いを防ぐことができます。または、ユーティリティ メソッドを自分で作成することもできます。
trait Conditional[+A] {
def apply[B >: A](p: => Boolean, b: => B): Conditional[B]
def or[B >: A](default: => B): B
}
class FoundIt[+A](it: A) extends Conditional[A] {
def apply[B >: A](p: => Boolean, b: => B) = this
def or[B >: A](default: => B) = it
}
class NothingYet[+A] extends Conditional[A] {
def apply[B >: A](p: => Boolean, b: => B) = {
if (p) new FoundIt(b) else this
}
def or[B >: A](default: => B) = default
}
def ifelse[A](p: => Boolean, a: => A) = (new NothingYet[A]).apply(p,a)
ifelse( f1(bar), 0 )( f2(bar), 1 ) or -1
これは長い式では少し厄介なので、次のこともできます (:paste
そこで動作させたい場合は、これを REPL の 1 つの大きなブロックに貼り付けるために使用します):
trait Predicate[+A] {
def Or(p: => Boolean): Loadable[A]
def Else[B >: A](default: => B): B
}
trait Loadable[+A] {
def Then[B >: A](b: => B): Predicate[B]
}
object NotYetTrue extends Predicate[Nothing] {
def Or(p: => Boolean) = if (p) ActuallyLoad else SkipLoading
def Else[B >: Nothing](default: => B) = default
}
object SkipLoading extends Loadable[Nothing] {
def Then[B >: Nothing](b: => B) = NotYetTrue
}
object ActuallyLoad extends Loadable[Nothing] {
def Then[B >: Nothing](b: => B) = new Loaded[B](b)
}
class Loaded[+A](a: A) extends Predicate[A] with Loadable[A] {
def Or(p: => Boolean) = this
def Else[B >: A](default: => B) = a
def Then[B >: A](b: => B) = this
}
def If(p: => Boolean): Loadable[Nothing] = NotYetTrue.Or(p)
唯一のトリックは:paste
、REPL で複数行のステートメントを記述し、前の行の最後に継続を配置するために使用する必要があることです。
If (f1(bar)) Then 0 Or
(f2(bar)) Then 1 Else
-1
また、ある行で使用Then { 0
して次の行で再度開始する} Or
か、括弧/中括弧とドットを使用してすべてを記述することもできます (これは REPL に適しています)。
If (f1(bar)) .Then (0) .
Or (f2(bar)) .Then (1) .
Else (-1)
いずれにせよ、このトリックはすべて、Scala を使用して洗練された DSL を構築する方法を示す良い例ですが、問題を解決する最善の方法ではありません。if/else ステートメントでもう少し注意することを学ぶ必要があります。そうしないと、なぜあなたが標準的な方法で物事を進めていないのか、人々は当惑するでしょう。(そして、パフォーマンスが重要な場合は遅くなる可能性があります。これmatch
はかなり優れていますが、If
高性能ループでは魔法はよくありません。)