裸'延伸'关键字

Nat*_*ord 9 scala

我在解决AJAX FormsLift Cookbook时感到困惑,我遇到了以下对象声明:

object EchoForm extends {
Run Code Online (Sandbox Code Playgroud)

这很令人困惑,所以我试了一下,编译得很好.我的Eclipse IDE似乎并没有表明任何其他功能是继承的,但我想我不相信只是"闲逛"的关键字.这个"赤身裸体" extends做了什么,还是解析为"没有特别延伸"?

sen*_*nia 11

它不是早期的对象初始化部分!看到这个答案.

这里应该是 Parentearly object initialization的,但在本书的代码示例中没有家长:

object EchoForm extends {
  def render = {
    ...
  }
} // no parents here!
Run Code Online (Sandbox Code Playgroud)

老答案(在@ som-snytt之前提到它是错的):

可能是(与父母一起)早期的对象初始化部分.看看这个例子:

trait Test {
  val i: Int
  val j = i + 1
}
Run Code Online (Sandbox Code Playgroud)

错误创建实例:

object TestObj extends Test { val i = 1 }
TestObj.j
// Int = 1
Run Code Online (Sandbox Code Playgroud)

j之前已初始化i,但j取决于i.

正确的创作:

object TestObj extends { val i = 1 } with Test
TestObj.j
// 2
Run Code Online (Sandbox Code Playgroud)

早期对象初始化部分允许在继承的特征的所有字段之前初始化字段.


som*_*ytt 5

这恰好出现在ML上:

https://groups.google.com/forum/#!topic/scala-user/_qMoODIBQtE

然后是手指发痒以弃用语法:

https://groups.google.com/d/msg/scala-internals/8zlyUH3S7sU/0EFiLSx9B68J

以下是语法的链接:

https://github.com/scala/scala-dist/blob/2.10.x/documentation/src/reference/SyntaxSummary.tex#L272

基本上,object Foo { }是一样的object Foo extends { }.

脚注:有问题的片段是无用的:

object EchoForm extends {
  def render = {
    //snip
  }
}
Run Code Online (Sandbox Code Playgroud)