package com.zhengkw.scala.day03Exc
/**
* @ClassName:Call
* @author: zhengkw
* @description:
* @date: 20/04/23下午 10:05
* @version:1.0
* @since: jdk 1.8 scala 2.11.8
*/
object Call {
def main(args: Array[String]): Unit = {
callbyname(foo)
println("____________")
callbyvalue(foo)
}
/**
* @descrption: 名调用
* @param a
* @return: int
* @date: 20/04/23 下午 10:12
* @author: zhengkw
*/
def callbyname(a: => Int) = {
a
a
a
}
/**
* @descrption:值调用
* @param a
* @return: int
* @date: 20/04/23 下午 10:12
* @author: zhengkw
*/
def callbyvalue(a: Int) = {
a
a
a
}
def foo(): Int = {
println("foo is called")
1
}
}
名调用 Vs无参函数
名调用传递的是代码块!即高级函数/高阶函数(Higher order functions
)的名调用,原理是参数为一个代码块!
高阶函数的参数是一个无参函数,那么传递的是无参函数!
惰性求值
变量var和常量val中只有val有惰性求值!关键字lazy
举个栗子
var a =10
lazy val b =20
当他们同写到一个.scala文件中作为object
的成员变量时,当加载到该文件,a会被直接加载出来,而b不会! 举个例子!
def main(args: Array[String]): Unit = {
lazy val a = {
println("a.....")
10
}
println("main -------")
println(a)//a..... \n 10
println(a) //10
println(a)
println(a)
println(a)
}
当他们同写到一个.scala文件中作为object
的成员变量时,当加载到该文件,a会被直接加载出来,而b不会!
object LazyDemo2 {
val a = {
println("a...")
10
}
lazy val b = {
println("b...")
20
}
def c = {
println("c...")
30
}
def main(args: Array[String]): Unit = {
// layz其实是介于 val和def之间的状况
println(a)
println(a)
println(b)
println(b)
println(c)
println(c)
println(c)
}
}
a…
10
10
b…
20
20
c…
30
c…
30
c…
30
Process finished with exit code 0
上面的代码中可以明显的看到,a是在没有调用时就已经开始了计算(这个最好打断点看)!b是在调用以后才输出b。。。,而C比较悲哀,必须调用一次计算一次!