Scala使用postfix函数非法启动简单表达式

时间:2016-05-10 17:59:29

标签: scala

我正在玩从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 expression表示if语句的行。我可以用新的一行修复它:

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

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

1 个答案:

答案 0 :(得分:2)

您需要明确启用后缀表达式:

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

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

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

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

  

此样式不安全,不应使用。因为分号是   可选,编译器将尝试将其视为中缀方法if   它可以,可能从下一行开始学习。

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

这可能会导致意外的编译错误,并且很愉快   最糟糕的是编译错误的代码。虽然某些人使用了语法   DSL应该被认为是弃用的,并且可以避免使用。