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]的子类. 为了生产这个没有什么 – 好吧,假装生产它 – 你实际上运行代码,并返回. *实际上,如果参数通过名称传递,则将其隐藏转换为()=> {代码}并通过而不进行评估. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |