Scala 名调用和值调用

本文探讨Scala中函数调用的两种方式——值调用和名调用。值调用会先计算参数的值,然后传递,而名调用则是将表达式本身传递给函数,每次使用时重新计算。这种区别在实际编程中可能导致不同的行为,例如在多次调用时的计算次数差异。

Scala 名调用和值调用

调用函数传值的时候有两种方法:

      默认都是值传递

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)
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值