3

我被困在工作中,电脑被锁定。但我正在尝试练习我的 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 不将行尾视为语句的结尾?


这个博客上的第二张海报似乎有答案。Scala 的人应该继续这样做。这样的烦恼....虽然这是我在这种原本美丽的语言中遇到的第一个令人讨厌的问题。 http://www.scala-lang.org/node/4143

文档中的另一个解释:http: //docs.scala-lang.org/style/method-invocation.html

4

1 回答 1

8

当您删除点时,Scala 假定您正在使用arg0 operator arg1语法。类似这样的东西也是一样的1 + 2:Scala 假设一个参数将跟随在操作符之后。

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

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

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

于 2012-05-18T17:05:05.690 回答