Scala隐式类中内部递归方法的执行逻辑疑问
Scala隐式类代码疑问解答
先看完整代码:
object ImplicitDemo { def calculate(f: => Int) = f * 37 implicit class IntWithTimes(x: Int) { def times[A](f: => A) : Unit = { def loop(current: Int): Unit = if(current > 0) { f loop(current - 1) } f loop(x) } } def main (args: Array[String]): Unit ={ (-5).times(println("abc")) } }
疑问解答
疑问1:
loop函数的初始current值为何等于x?loop是times方法内部定义的函数,当times里调用loop(x)时,是把IntWithTimes类构造时传入的x(也就是调用.times的那个Int值,这里是-5)作为实参,传递给loop的形参current,所以current的初始值自然就是x。疑问2:传入
loop(x)时x为-5,为何不会死循环?loop函数的逻辑是只有当current > 0时,才会执行传入的f并递归调用loop(current-1)。当x=-5时,loop的初始current是-5,-5 > 0不成立,所以if代码块完全不会执行,直接退出loop函数,根本不会触发递归,自然不会死循环。
补充:这段代码里(-5).times(println("abc"))只会打印一次"abc",因为times方法在调用loop之前先执行了一次f,而loop内部的f根本没机会执行。
内容的提问来源于stack exchange,提问作者Carol
相关产品推荐
相关产品推荐

