名前による呼び出しパラメーターを使用したい場合は、次で十分だと思います。
implicit def extendedBoolean(a : Boolean) = new {
def implies(b : => Boolean) = {
!a || b
}
}
説明:
for に何らかの値を渡す必要がありb
ますが、その式を評価したくありません。Scala は、式を引数を取らず、式に評価される関数に自動的に変換できます。演算子implies
は、必要に応じてその nullary (ゼロ引数) 関数を評価します。
コンパイラは、指定した型シグネチャにより、この変換を実行できることを認識しています=> Boolean
。この投稿ではより詳細に説明していますが、そのタイトルだけでも何が起こっているかを簡潔に説明しています: "Automatic Type-Dependent Closure Construction" .
Scala のこの機能により、おそらく他の言語でマクロを使用して記述するのと同じくらい簡単に、制御構造を記述できます。2 つの名前による呼び出しパラメーター (1 つは条件用、もう 1 つは本体用) を使用して、while ループをいかに簡単に再実装しているかを観察してください。
object TargetTest2 extends Application {
//type signature not too terribly mysterious
def whileLoop(cond: => Boolean)(body: => Unit): Unit =
if (cond) {
body
whileLoop(cond)(body)
}
//about as easy to use as a plain-old while() loop
var i = 10
whileLoop (i > 0) {
println(i)
i -= 1
}
}