什么时候需要Scala Semicolons

问题描述 投票:3回答:1

我被困在一台锁定的电脑上工作。但我正在尝试练习我的Scala。我使用Ideone.com,因为我甚至无法安装scalac ...

无论如何这不是编译:

class DPt(var name: String, var x: Double, var y: Double){

        def print = println("DPt; name: " + name + " x: " + x + " y: " + y)
}


object Main {
  def main(args: Array[String]) {
        val pt0 = new DPt("Joe", 1.0, 1.0)
        println("checking generated accessor: " + pt0.x)
        pt0 print
        pt0.x_=(3.0)
        pt0 print
  }
}

我从Ideone.com scala编译器收到此消息:

Main.scala:12: error: Unit does not take parameters
    pt0 print
            ^
one error found
spoj: The program compiled successfully, but Main.class was not found.
      Class Main should contain method: def main(args: Array[String]).

但是,当我在语句的末尾添加分号时,如下所示:

class DPt(var name: String, var x: Double, var y: Double){

        def print = println("DPt; name: " + name + " x: " + x + " y: " + y)
}


object Main {
  def main(args: Array[String]) {
        val pt0 = new DPt("Joe", 1.0, 1.0);
        println("checking generated accessor: " + pt0.x);
        pt0 print;
        pt0.x_=(3.0);
        pt0 print;
  }
}

我发现Scala中的中缀和后缀表示法很棒,但我必须遗漏一些东西。为什么Scala不认为该行的结尾是声明的结尾?


这个博客上的第二张海报似乎有答案。斯卡拉人应该继续这样做。这样的烦恼....虽然这是第一次讨厌这个我在这个美妙的语言中遇到的烦恼。 http://www.scala-lang.org/node/4143

直接来自文档的另一种解释:http://docs.scala-lang.org/style/method-invocation.html

scala jvm postfix-notation
1个回答
8
投票

删除点时,Scala假定您使用的是arg0 operator arg1语法。它与1 + 2相同:Scala假设一个参数将跟随运算符。

所以,假设print是一个接受参数的方法,它会转到下一行寻找一个参数。你得到一个错误,因为那实际上不起作用:print没有参数。

通过添加分号,您告诉编译器肯定不会有该方法的参数,因此它将停止查找。这有助于编译器发现print不需要参数,所以一切都很好。

要解决问题,只需说pt0.print,你会没事的。

© www.soinside.com 2019 - 2024. All rights reserved.