4

我想到了一个想法,为了为对象创建一个前缀方法,我可以:在方法名称的末尾使用,因此,我写道:

def aaa: {
}

它编译得很好!但是,这没有用,所以我想让方法返回一些东西,所以,不确定,我写:

def aaa: = {
}

错误!

- identifier expected but '=' found.
- not found: type <error>

好的,我知道编译器会中断: =,我变得好奇并尝试:

def aaa: {
  println("wow")
}

又报错了!

illegal start of declaration (possible cause: missing `=' in front of current method body)

然后我试试这个:

val a = aaa

它说(悬停在aaaaaa签名是def aaa: AnyRef,所以我尝试:

def aaa: {
  Global
}

哪里Globalobject。还是错误。所以,我的问题是:为什么允许这种语法?我不能让它像前缀方法一样工作,我不能用这个方法来产生副作用,我不能让它返回任何东西。为什么它首先允许我这样写?

更新:

现在我试试这个:

def aaa: {} = {
  Global
}

它有效。所以看起来像{}表示AnyRef。开始感觉我仿佛置身于 JavaScript 仙境。

4

1 回答 1

9

您会收到这些错误,因为方法名称末尾的冒号意味着您要指定返回类型。如果你不给,编译器会抱怨。有了{}它就可以了,因为你给了一个类型,在这种情况下是一个空的结构类型,它基本上与AnyRef. 有一些规则,当您实际上被允许在方法名称的末尾添加冒号时,afaik 该方法只能由非字母数字字符组成。所以def +:(x:Int)没关系,def foo:(x:Int)导致错误。但我对此并不确定。以冒号结尾的方法也是右关联的。

于 2012-09-11T10:35:37.143 回答