当需要斯卡拉分号(When are Scala Semicolons required)

2019-09-17 07:59发布

我被困在工作中有一个锁定PC。 但是我想练习我的斯卡拉。 我使用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中缀和后缀符号是真棒 ,但我必须失去了一些东西。 为什么不斯卡拉考虑行的末尾是语句的结束?


在这个博客上第二张海报似乎有了答案。 斯卡拉的人应该就在这。 这样的烦恼....虽然这是对第一个恼人的这个我在这个本来美好的语言所遇到的。 http://www.scala-lang.org/node/4143

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

Answer 1:

当你放下点,斯卡拉假设您正在使用arg0 operator arg1语法。 它喜欢的东西一样1 + 2 :斯卡拉假设的说法是要遵循的操作。

因此,它假设print是一个需要参数的方法,并且它去寻找一个下一行。 你得到一个错误,因为这并不实际工作: print不带参数。

通过添加分号,你是在告诉编译器,有绝对不会是一个参数的方法,所以它会停止寻找一个。 这有助于编译器把那块print不需要的说法,所以一切都很好。

为了解决这个问题,只是说pt0.print ,你会没事的。



文章来源: When are Scala Semicolons required