【问题标题】:Why need a blank line after process(aString)! in scala?为什么在处理(字符串)之后需要一个空行!在斯卡拉?
【发布时间】:2016-12-15 20:37:08
【问题描述】:

当我运行一个外部进程时,看起来我们需要在调用之后添加一个空行。为什么会抛出这个错误?

 class JobActor extends Actor {
  def receive = {
    case msg:String =>
       Process(msg)!
                       // here need a blank line, otherwise it throws error 
       sender ! "complete"
  } 
}

错误是

[error]  found   : akka.actor.ActorRef
[error]  required: scala.sys.process.ProcessLogger
[error]        sender ! "complete"
[error]        ^
[error] one error found

【问题讨论】:

    标签: scala


    【解决方案1】:

    您找到了为什么后缀运算符是一个在使用 -feature 标志编译时会生成警告的功能的确切原因。

    以下是解释为何此类功能仍在讨论中的摘录(已添加重点):

    后缀操作。仅在启用的情况下,后缀运算符表示法 (expr op) 将被允许​​。 为什么要保留这个功能? 用 Scala 编写的几个 DSL 需要符号。 为什么要控制它? 后缀操作符交互不佳 用分号推断。大多数程序员出于这个原因避免使用它们。

    (source)

    Process 定义了两个方法

    abstract def !: Int 
    abstract def !(log: ProcessLogger): Int 
    

    当你这样做时

    Process(msg)!
    

    您的意思是调用前者,但由于没有明确指示该行应该结束(即应该推断出分号),解析器开始读取下一行,它发现某些东西可以在语法上是一个参数(@ 987654327@),而你最终调用了! 的第二个版本。

    生成的代码实际上是:

    Process(msg)! sender ! "complete"
    

    即

    (Process(msg).!(sender)).!("complete")
    

    因此出现错误:sender 不是ProcessLogger 的实例。

    为了解决它,您必须自己解开歧义。有很多方法可以做到这一点,最简单的一种是完全避免使用后缀运算符:

    Process(msg).!
    sender ! "complete"
    

    实际上,给定this other question of yours,你甚至可以这样做

    msg.!
    sender ! "complete"
    

    【讨论】:

      【解决方案2】:

      这可能是另一种情况,Scala 的语法不允许在表达式末尾以外的任何其他位置使用后缀运算符。

      第一个在“Why does this code need an empty line or a semicolon?”中描述

      添加分号也可能使代码编译,因为semicolon inference。

      Process(msg)!;
      sender ! "complete"
      

      【讨论】:

        猜你喜欢
        • 2010-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        • 2014-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多