scala – 对此代码段返回类型与&without =相当混淆
object A extends App { def closure1(x:Int) = { object O { def getX = x def add(y:Int) = x+y } val foo = O foo } def closure2(x:Int) { object O { def getX = x def add(y:Int) = x+y } val foo = O foo } println(closure1(4).getClass) println(closure2(4).getClass) } result: $scala A class A$O$3$ void >为什么返回类型不同? 解决方法
Scala有一个代码的简写表示法,它不会返回任何有趣的值:省略=符号.在Java中,这将返回无效,即根本没有;但是在Scala中它实际上是(),这个类型中唯一一个叫Unit的成员.无论哪种方式,它都是相同的:没有任何东西或无意义的占位符.
你想要一个没有意义的占位符的原因是,当你编写通用代码时,你宁愿不必处理某些事情的情况,而不是以不同的方式处理. 无论如何: def f(): Unit = println("Hi") 是一个显式只返回content-free()值的函数(也就是println返回的值).简写就是 def f() { println("Hi") } 现在有一个偷偷摸摸的补充,就是在Scala中,与许多C派生语言一样,你可以放弃你所做的任何返回值.当你扔掉它时,剩下的就是(). Scala会在关闭时警告你,你正在做一些可疑的事情: <console>:16: warning: a pure expression does nothing in statement position you may be omitting necessary parentheses foo ^ defined module A 但是仍然会让你这样做(因为历史上预计这将有效). 所以,总结一下: def f {} 是一种只返回无内容占位符()的方法.如果你完整地写出来,语法就是 def f: Unit = {} 并且当您尝试返回错误类型的值时,而不是抱怨它会抛弃该值并为您键入Unit,但通常会发出警告: def f: Unit = 5 def f { 5 } (请注意,这些天的观点主要是针对短形式(这些日子是2.10稳定),很大程度上是因为在没有明确解释差异的情况下,新用户经常忽略=没有意识到它然后想知道为什么事情不起作用.所以在将来(弃用2.11或2.12?)def f {}形式可能不起作用.) 如果你真的想要一个返回值 – 因为,例如,你想要返回你的对象O(你可以直接做到这一点而不先将它分配给foo,顺便说一句),请确保包括=: def f = { object O { def g = 5 }; O } scala> f.g res0: Int = 5 (提示:编译器会抱怨你在这里使用结构类型.你最好使用特征HasG {def g:Int}然后对象O扩展HasG;否则Scala实际上使用反射来调用fg的一些基本原理我从来没有完全遵循过.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |