加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么Scala的分号推论在这里失败?

发布时间:2020-12-16 09:33:48 所属栏目:安全 来源:网络整理
导读:在使用Scala 2.7.3编译以下代码时, package spojobject Prime1 { def main(args: Array[String]) { def isPrime(n: Int) = (n != 1) (2 to n/2 forall (n % _ != 0)) val read = new java.util.Scanner(System.in) var nTests = read nextInt // [*] while(
在使用Scala 2.7.3编译以下代码时,

package spoj

object Prime1 {
  def main(args: Array[String]) {
    def isPrime(n: Int) = (n != 1) && (2 to n/2 forall (n % _ != 0))
    val read = new java.util.Scanner(System.in)
    var nTests = read nextInt // [*]
    while(nTests > 0) {
      val (start,end) = (read nextInt,read nextInt)
      start to end filter(isPrime(_)) foreach println
      println
      nTests -= 1
    }
  }
}

我得到以下编译时错误:

PRIME1.scala:8: error: illegal start of simple expression
    while(nTests > 0) {
    ^
PRIME1.scala:14: error: block must end in result expression,not in definition
  }
  ^
two errors found

当我在文章末尾添加一个分号作为[*]时,该程序编译正常。任何人都可以解释为什么Scala的分号推论不能在特定的行上工作?

解决方法

是因为scala假设您在调用readInt时使用语法foo b(相当于a.foo(b))。也就是说,它假定while循环是readInt的参数(记住每个表达式都有一个类型),因此最后一个语句是一个声明:

var ntests = read nextInt x

wherex是你的while块。

我必须说,作为一个优先选择,我现在已经重新使用通常的a.foo(b)语法,除非专门用于设计使用的DSL(像演员的一个!b)。它使事情变得更加清晰,你不会被这样的怪异的东西咬伤!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读