k r*_*k r 4 closures scala equals-operator
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
Run Code Online (Sandbox Code Playgroud)
Rex*_*err 15
Scala有一个代码的简写表示法,它不会返回任何有趣的值:省略=符号.在Java中,这将返回void,即根本没有; 但实际上(),在Scala中,该类型的唯一成员称为Unit.无论哪种方式,它都是相同的:没有任何东西或无意义的占位符.
你想要一个没有意义的占位符的原因是,当你编写通用代码时,你宁愿不必处理某些事情的情况,而不是以不同的方式处理.
无论如何:
def f(): Unit = println("Hi")
Run Code Online (Sandbox Code Playgroud)
是一个显式只返回无内容()值的函数(也是println返回的值).简写就是
def f() { println("Hi") }
Run Code Online (Sandbox Code Playgroud)
现在有一个偷偷摸摸的补充,就是在Scala中,与许多C派生语言一样,你可以放弃你所做的任何返回值.当你扔掉它时,剩下的就是().Scala会警告你closure2,你正在做一些可疑的事情:
<console>:16: warning: a pure expression does nothing in statement position
you may be omitting necessary parentheses
foo
^
defined module A
Run Code Online (Sandbox Code Playgroud)
但是仍然会让你这样做(因为历史上预计这将有效).
所以,总结一下:
def f {}
Run Code Online (Sandbox Code Playgroud)
是一种只返回无内容占位符的方法().如果你完整地写出来,语法就是
def f: Unit = {}
Run Code Online (Sandbox Code Playgroud)
并且当您尝试返回错误类型的值时,而不是抱怨它抛弃该值并为您提供类型Unit,但通常会发出警告:
def f: Unit = 5
def f { 5 }
Run Code Online (Sandbox Code Playgroud)
(请注意,这些天的观点主要是反对短形式(这些日子是2.10稳定),很大程度上是因为在没有明确解释差异的情况下,新用户经常忽略=而没有意识到它然后想知道为什么不起作用.所以在将来(弃用2.11或2.12?)def f {}表格可能不起作用.)
如果你真的想要一个返回值 - 例如,因为你想要返回你的对象O(你可以直接做到这一点而不先将其分配给foo,顺便说一句),请确保包括=:
def f = { object O { def g = 5 }; O }
scala> f.g
res0: Int = 5
Run Code Online (Sandbox Code Playgroud)
(提示:编译器会抱怨你在这里使用结构类型.你最好trait HasG { def g: Int }还是那么object O extends HasG;否则Scala实际上使用反射来调用f.g我从未完全能够遵循的一些基本原理.)
| 归档时间: |
|
| 查看次数: |
8494 次 |
| 最近记录: |