我偶然遇到了奇怪的Scala语法编译:
class Some extends {
def hi = println("hi")
}
Run Code Online (Sandbox Code Playgroud)
专家:
Object
?谢谢.
这实际上是Scala语法中的一个奇怪的怪癖.extends
在开始课堂主体之前允许无关紧要.以下是Scala语法摘要中的相关部分:
ClassDef ::= id [TypeParamClause] {ConstrAnnotation} [AccessModifier]
ClassParamClauses ClassTemplateOpt
ClassTemplateOpt ::= ‘extends’ ClassTemplate | [[‘extends’] TemplateBody]
ClassTemplate ::= [EarlyDefs] ClassParents [TemplateBody]
Run Code Online (Sandbox Code Playgroud)
ClassTemplateOpt
是类的参数之后的所有内容,在这种情况下从一extends
开始就是一切.通常使用的extends
是第一次交替ClassTemplateOpt
,extends
由父母或早期初始化者遵循.但是,早期的初始化程序不能包含a def
,并且无法将大括号的内容解释为父级.它不能是结构类型,因为它hi
具有一个具体的定义.
第二次交替允许类参数紧跟在类体之后,而不使用extends
.但是,extends
允许使用可选项.的extends
在OP的代码是这样的一个例子,并且是完全等同于相同的代码没有可选延伸:
class Some {
def hi = println("hi")
}
Run Code Online (Sandbox Code Playgroud)
这实际上只是一个语法上的意外(我想).Scala允许早期定义看起来像
class Some extends {
...
} with ATrait
Run Code Online (Sandbox Code Playgroud)
所以解析器也接受class Some extends { ... }
相当于class Some { ... }
(源)的.