我正在尝试理解下面的代码。
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"))
}
}
IntWithTimes
是Int
的隐式类,这意味着它拥有Int
所具有的一切加上times
函数。
当我调用(-5).times(println("abc"))
时,在这个部分中,println("abc")
被赋值给f
,f: => A
和times
函数也有自己的主体。
因此,当times
主体被调用时,内部函数loop
也会被调用。为什么current
的值等于x
?这是我的第一个怀疑……难以理解这一点。
第二个疑问是,它是如何从loop
函数体中出来的?直到x > 0
,它将继续在if
条件下运行,并继续调用嵌套的loop
,一旦(x or current < 0
),它将转到loop(x)
.这里它似乎被困在循环中..它是如何从loop's
主体中出来的?
请帮助我消除这一疑虑。
谢谢
1条答案
按热度按时间9njqaruj1#
为什么当前值等于x?
因为先使用
x
:loop(x)
调用loop
方法。current
是loop
方法的参数,其他任何地方都不存在。它是怎么从循环函数体中出来的?在x>0之前,它将继续执行If条件并继续调用嵌套循环
因为每次都使用
current-1
(而不是x
)调用loop
,因此current
在某个点将等于0,并且不会调用if
部分。一旦输出(x或电流<0),它就进入循环(X)
不是的。
loop(x)
是从times
到方法loop
的第一次也是唯一一次调用。def loop
不调用loop
,它是一个方法的声明。请注意,在上面解释的所有行为中,都没有与按名称传递参数
f
相关的内容。编辑:您可能已经注意到,从
-5
开始实际上甚至不会进入递归。