调用函数传值的时候有两种方法:
默认都是值传递
1、值调用
object NameValue {
def main(args: Array[String]): Unit = {
//先计算再把 7 传递给 foo
foo(3+4) //foo(7)
}
def foo(a:Int)={
println(a)
println(a)
}
}
object NameValue {
def main(args: Array[String]): Unit = {
val f = ()=>{
println("f.....")
10
}
foo(f())
}
def foo(a: Int)={
println(a)
println(a) // 若println(a) 全去掉则不输出任何值
println(a)
}
}
输出:
f…
10
10
10
2、名调用
object NameValue {
def main(args: Array[String]): Unit = {
val f = ()=>{
println("f.....")
10
}
foo(f())
}
/*用这种方法传代码也可
* foo({ // 小括号可以省略
* println("f.....")
* println("f.....")
* println("f.....")
* 10
* })
*/
//名调用:a收到的不是具体的值,而是一个计算过程
//接受一段代码,这段代码计算后的值是 Int
def foo(a: => Int)={ //用箭头使用名调用
println(a)
println(a)
println(a)
}
}
输出:
f…
10
f…
10
f…
10
两者差别:
值调用是先计算出 a 的值 10 再传给 foo( ) ,计算只计算一次,故只出现一次 f…
名调用是把这段代码传给foo( ),用一次执行一次,故三次调用出现输出三次 f…
输出0~100:
object NameValue {
def main(args: Array[String]): Unit = {
var a:Int = 0
loop(a<=100){
println(a)
a+=1
}
}
// 不能使用 condition:Boolean 因为它只计算一次,传出 true,不会继续判断,继而循环不会停止
//因为条件是要变化的,故需要用名调用
//使用了柯理化add(a:Int,b:Int) => add(a:Int)(b:Int)
def loop(condition: =>Boolean)(op: => Unit):Unit={
if(condition){
op
loop(condition)(op)
}
}
}
本文探讨Scala中函数调用的两种方式——值调用和名调用。值调用会先计算参数的值,然后传递,而名调用则是将表达式本身传递给函数,每次使用时重新计算。这种区别在实际编程中可能导致不同的行为,例如在多次调用时的计算次数差异。

1万+

被折叠的 条评论
为什么被折叠?



