加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 从foreach的短路功能

发布时间:2020-12-16 18:57:54 所属栏目:安全 来源:网络整理
导读:我的同事和我对以下代码的行为有点困惑. def a: String = { None.foreach(return "1") return "2"}def b: String = { None.foreach(x = return "1") return "2"} 如预期的那样,调用b将返回“2”.但是,调用返回值为“1”.当执行a时是否正在评估返回“1”? 解
我的同事和我对以下代码的行为有点困惑.

def a: String = {
  None.foreach(return "1")
  return "2"
}

def b: String = {
  None.foreach(x => return "1")
  return "2"
}

如预期的那样,调用b将返回“2”.但是,调用返回值为“1”.当执行a时是否正在评估返回“1”?

解决方法

表单的所有*函数评估

f({code})

相当于

val temp = { code }
f(temp)

所以,在第一种情况下,

val temp = return "1"
None.foreach(temp)   // Never reach this point!

而在第二,

val temp = (x: Nothing) => return 1
  // Equivalent: new Function1[Nothing,String]{ def apply(x: Nothing) = return "1" }
None.foreach(temp)   // Never call that weird function!

所以一切都好.

但是,等等,foreach取A =>单元.如何返回“1”这样的功能?那么,Scala从最具体的类型开始(没有什么,它是任何东西的子类,因此承诺做任何你要求的东西,除非它不存在).然后,由于语句(控制通过返回转义)没有产生任何值,所以它从不会从Nothing修改它.所以,确实,没有什么是Function1 [A,Unit]的子类.

为了生产这个没有什么 – 好吧,假装生产它 – 你实际上运行代码,并返回.

*实际上,如果参数通过名称传递,则将其隐藏转换为()=> {代码}并通过而不进行评估.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读