【问题标题】:When are Scala Semicolons required什么时候需要 Scala 分号
【发布时间】:2012-05-18 16:59:54
【问题描述】:

我被困在工作中,电脑被锁定。但我正在尝试练习我的 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 中的中缀和后缀表示法是 AWESOME,但我一定遗漏了一些东西。为什么 Scala 不将行尾视为语句的结尾?


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

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

【问题讨论】:

标签: scala jvm postfix-notation


【解决方案1】:

当您删除点时,Scala 假定您使用的是arg0 operator arg1 语法。 1 + 2 之类的东西也是如此:Scala 假设参数将跟随运算符。

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

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

要解决此问题,只需说 pt0.print 即可。

【讨论】:

  • 另外,您可以在pt0 print 之后添加一个空行,它会将其解释为该特定语句的结尾,就像; 一样。
  • 所以 scala 假设当我放下点时我使用中缀表示法,即使 print 需要 0 个参数?为什么scala不能根据方法的稀缺性找出中缀和后缀之间的区别?我正在阅读 Wampler 和 Payne 的 Programming Scala,但没有提到这一点。该示例是一个孤立的 scala 代码行:“List(1, 2, 3) size” 没有提到 a ;或 \n\n 必需....
  • @mattwalters 该声明是去年在 Twitter 上发布的;我很惊讶你错过了它:twitter.com/#!/odersky/statuses/49882758968905728
  • Scala 不能使用类型来确定此时要做什么,它必须能够明确解析,然后才能确定调用哪个方法。
猜你喜欢
  • 2022-11-28
  • 2019-08-13
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多