ScalaIDE - 以冒号结尾的方法的奇怪之处

标签 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 的仙境中。

最佳答案

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

关于ScalaIDE - 以冒号结尾的方法的奇怪之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12367488/

相关文章:

syntax - 如何在 mysql 查询中使用花括号?

scala - 为什么 foreach 对于带有 toUpperCase 的字符串类型列表失败?

scala - 如果在 Slick 3.0.0 中不存在则插入以进行批量插入

c - 在 AVR 中使用 eeprom 函数的 C 语法错误

Ruby 语法错误,意外的 tLABEL

c++ - BidirectionalIterator 的 decltype(*it) 是什么?

c++ - auto 和 __auto_type 之间有什么区别吗?

haskell - 这是 Haskell 类型推理的实际应用,还是其他什么?

scala - 为什么 Spark-xml 因 Spark 2.0.0 依赖项而失败并出现 NoSuchMethodError 错误?

scala - 扩展特征的单元测试类 - 如何模拟和 stub 特征中的方法?