【问题标题】:Scala illegal start of simple expression with postfix functionScala 使用后缀函数非法开始简单表达式
【发布时间】:2016-05-10 17:59:29
【问题描述】:

我正在玩从 Scala 调用外部命令。这是我正在研究的一个精简示例:

import scala.sys.process._

object Testing {
    def main(args: Array[String]) {
        val command = "ls"
        val result = command!
        if (result != 0) {    // <---- illegal start of simple expression
            println("Error")
            return
        }
    }
}

我收到一个编译错误:illegal start of simple expressionif 语句的行。我可以用新的一行来修复它:

val result = command!
                      // Add a line
if (result != 0) { 

我怀疑它与! 后缀函数有关,但我的理解是多余的行/空格不应该对编译器产生影响。

【问题讨论】:

标签: scala


【解决方案1】:

您需要显式启用后缀表达式:

1) 本地导入标志:import scala.language.postfixOps

2) 或将标志添加到项目本身:scalacOptions += "-language:postfixOps"

@Łukasz 评论中的上述链接包含有关此功能的大量信息。此外,请参阅“后缀符号”部分中的http://docs.scala-lang.org/style/method-invocation.html,了解您的具体用例。

编辑: 可能不够清楚,但正如@Łukasz 在 cmets 中指出的那样,导入/启用后缀表达式不会使您的代码编译。它只是避免了编译器警告。您的代码不会编译,因为分号是可选的,并且编译器将 ! 运算符视为中缀,因此从下一行获取表达式的元素。这正是上面链接中的文档用完全相同的示例说明的内容:

此样式不安全,不应使用。由于分号是 可选,编译器将尝试将其视为中缀方法,如果 它可以,可能会从下一行取一个术语。

names toList
val answer = 42        // will not compile!

这充其量可能会导致意外的编译错误,并且很高兴 在最坏的情况下编译错误的代码。虽然语法被某些人使用 DSLs,它应该被视为已弃用和避免。

【讨论】:

  • 你实际上不需要导入这个,如果你这样做,你将避免编译器警告。它的工作原理仍然完全相同,因此 OP 发布的内容无法编译。这是确切的警告消息warning: postfix operator ! should be enabled by making the implicit value scala.language.postfixOps visible. This can be achieved by adding the import clause 'import scala.language.postfixOps' or by setting the compiler option -language:postfixOps. See the Scala docs for value scala.language.postfixOps for a discussion why the feature should be explicitly enabled.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
相关资源
最近更新 更多