ScalaIDE - 以冒号结束的方法的一种奇怪之处

时间:2012-09-11 10:15:33

标签: scala syntax type-inference

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

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

它说{悬停在aaa上)aaa签名是def aaa: AnyRef,所以我试试:

def aaa: {
  Global
}

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

更新

现在我试试这个:

def aaa: {} = {
  Global
}

它有效。所以看起来{}表示AnyRef。开始觉得我在JavaScript仙境里。

1 个答案:

答案 0 :(得分:8)

您收到这些错误,因为方法名称末尾的冒号表示您要指定返回类型。如果你不给一个,编译器会抱怨。使用{}它是有效的,因为您提供了一个类型,在本例中是一个空结构类型,它与AnyRef基本相同。有规则,当您实际允许在方法名称的末尾添加冒号时,该方法只能由非字母数字字符组成。所以def +:(x:Int)没问题,def foo:(x:Int)会导致错误。但我对此并不确定。以冒号结尾的方法也是右关联的。