裸'延伸'关键字

时间:2013-12-18 19:00:33

标签: scala

我对Lift Cookbook for AJAX Forms感到困惑,我遇到了以下对象声明:

object EchoForm extends {

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

3 个答案:

答案 0 :(得分:11)

这不是早期的对象初始化部分!请参阅this answer

Parentshould be early object initialization,但在本书的代码示例中没有父母:

object EchoForm extends {
  def render = {
    ...
  }
} // no parents here!

旧答案(在@ som-snytt提到错误之前):

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

trait Test {
  val i: Int
  val j = i + 1
}

错误创建实例:

object TestObj extends Test { val i = 1 }
TestObj.j
// Int = 1

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

正确创作:

object TestObj extends { val i = 1 } with Test
TestObj.j
// 2

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

答案 1 :(得分: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
  }
}

答案 2 :(得分:2)

  

这个'裸'扩展是做任何事情,还是解析为'特别延伸'?

它会在单词extends之后立即扩展'内联'匿名类:

object EchoForm extends <definition of anonymous class here - within brackets, optionally followed by `with` clauses for trait mixins>