risc-v中文社区

 找回密码
 立即注册
查看: 1120|回复: 1

[原创] risc-v开发基础 Scala 函数传值调用和传名调用---(14)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-4 17:10:59 | 显示全部楼层 |阅读模式
object FunctionCALLByName {

  def main(args: Array[String]): Unit = {
    delayed(time())
    delayed({
      val lv = 128L
      println("running...")
      lv
    })
  }
  def time() = {
    println("获取时间,单位为纳秒")
    System.nanoTime
  }
  def delayed( t: => Long ) = {
    println("在 delayed 方法内")
    println("参数: " + t)
    t
  }
}
//很多人对上述代码分析:delayed函数接收一个参数t,而这个t也是一个函数或代码块,这个函数或代码块无参且返回值是Long
//此处对应t的实参是time函数,所以执行顺序是:
//1)println("在 delayed 方法内")
//2)println("参数: " + t)
//3)t
//4)println("获取时间,单位为纳秒")
//我先将实验打印显示列在下面:
// 在 delayed 方法内
//获取时间,单位为纳秒
//参数: 30777989319706
//获取时间,单位为纳秒
//在 delayed 方法内
//running...
//参数: 128
//running...
//说明很多人的想法都是错误的,一般函数我们理解都是传值调用,也就是说在调用之前,其实已经准备好了一份参数值
//但针对这样的t:=>XXX参数采用是传名调用,即在函数内部进行参数表达式的计算
//也就是说在delayed调用的时候并不会先time()这个函数取得值,而是先进到delayed之内println("在 delayed 方法内")
//下一句中println("参数: " + t),需要获取t所代表的函数或代码块的返回值,所以就要调用time(),
//time()获得返回值之后最后再来一次调用t,也就是再次执行time()

回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-8-4 17:24:46 | 显示全部楼层
val flag = false
    def log(msg: =>String) { //如果换成msg: String则执行时log(MSG + 1/0)出现:ArithmeticException: / by zero
      if(flag) println(msg)
    }
    val MSG="hello"
    log(MSG + 1/0)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-3 08:34 , Processed in 0.016100 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表