在Scala中,有传名参数:
def f(para: => Int)={...}
该传名的意思是,该参数已经就位了,可以参数任何运算了。
在参加运算的过程中,如果需要计算该参数,再进行计算,典型的例子是在运算中出现递归。
例如:
def foldRight[A, B](l: List[A], z: => B)(f: (A, => B) => B): B = { l match { case Nil => z case x :: xs => f(x, foldRight(xs, z)(f)) } } def exists(p: Int => Boolean) = { foldRight(a, false)((a, b) => p(a) || b) }
foldRight(xs, z)(f)
为实参,在实际调用中并不需要一直循环计算foldRight(xs, z)(f)
的值用于展开函数实体p(x) || foldRight(xs, z)(f)
的运算,只需要将其看做terminal
,直接展开函数实体进行运算即可。如果
p(x)
是true
的话,就不需要计算foldRight(xs, z)(f)
的数值,程序可以提前结束,传名参数不再计算该参数对应的数值。
网友评论