名前渡しパラメータ

面白い。

scala> def add(a: Int, b: Int) = b + a
add: (Int,Int)Int

scala> def aa() = { println("aa"); 1 }
aa: ()Int

scala> def bb() = { println("bb"); 3 }
bb: ()Int

scala> println(add(aa(), bb()))
aa
bb
4

scala> def add_(a: => Int, b: => Int) = b + a
add_: (=> Int,=> Int)Int

scala> println(add_(aa(), bb()))
bb
aa
4

ふむふむ。

scala> def _if(cond: Boolean)(op: => Unit) = if (cond) op
_if: (Boolean)(=> Unit)Unit

scala> _if (2 > 1) { println("a"); println("b") }
a
b

scala> _if (2 > 3) { println("a"); println("b") }

おー。

scala> def twice(op: => Unit) { op; op }
twice: (=> Unit)Unit

scala> twice { print("a"); print("b"); println() }
ab
ab

おーー。

scala> class Times(val n: Int) {
     |   def times(op: => Unit) = for (i <- 1 to n) op
     | }
defined class Times

scala> implicit def intToTimes(n: Int) = new Times(n)
intToTimes: (Int)Times

scala> 3 times { println("ab") }
ab
ab
ab

おーーー。