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

non*_*com 3 syntax scala type-inference

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

def aaa: {
}
Run Code Online (Sandbox Code Playgroud)

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

def aaa: = {
}
Run Code Online (Sandbox Code Playgroud)

错误!

- identifier expected but '=' found.
- not found: type <error>
Run Code Online (Sandbox Code Playgroud)

好的,我明白编译器坏了: =,我变得很好奇,我尝试:

def aaa: {
  println("wow")
}
Run Code Online (Sandbox Code Playgroud)

再次出错!

illegal start of declaration (possible cause: missing `=' in front of current method body)
Run Code Online (Sandbox Code Playgroud)

然后我试试这个:

val a = aaa
Run Code Online (Sandbox Code Playgroud)

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

def aaa: {
  Global
}
Run Code Online (Sandbox Code Playgroud)

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

更新:

现在我试试这个:

def aaa: {} = {
  Global
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理.所以看起来像这样{}表示AnyRef.开始觉得我在JavaScript的仙境里.

dre*_*xin 8

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

  • `def foo_:(x:Int)`没关系.您必须将标识符中的字母数字和运算符符号与`_`分开. (7认同)