有没有办法在build.sbt中使用模式匹配?

时间:2015-04-25 11:47:39

标签: scala build pattern-matching sbt

我正在尝试使用Scala的PlayFramework,并且遇到了build.sbt文件的问题。具体做法是:

Pattern matching in val statements is not supported

这是显而易见的:

val env = sys.props.getOrElse("ENV", default = "local") 
val (someVal, otherVal) = env match {
    case "local" => ("x","a")
    case _ => //etc
}

有没有办法在build.sbt文件中使用匹配语句?该错误表明它在val语句中不受支持。它实际上在哪里支持?

编辑:

我也尝试过将一个方法添加到build.scala对象中,但即使我使用plain if语句,我仍然会得到相同的&#34;不支持val语句中的模式匹配&#34; < / p>

Build.scala:

import sbt._
import Keys._

object ExampleBuild extends Build {

    def getEnvData(env: String) = {
        if(env == "local") {
            ("c","q") 
        } else if (env == "other") {
            ("b","v")
        } else {
            ("x","a")
        }
    }    
}

并更新了build.sbt:

val env = sys.props.getOrElse("ENV", default = "local") 
val (someVar, otherVar) = ExampleBuild.getEnvData(env)

但无济于事。

1 个答案:

答案 0 :(得分:3)

错误不是由match语句引起的,而是由此引起的:

val (someVar, otherVar) = ...

这是sbt不支持的模式匹配形式(在元组上)。

以下是SbtParser implementation

的相关评论
  

//检查否val(a,b)= foo val a,b = foo,因为这些对于范围位置和整个架构都有问题。

您可以使用案例类而不是元组来解决此限制。

<{1}} 中的

Build.scala
<{1}}

中的

case class EnvData(someVar: String, otherVar: String) 

然后像build.sbtval envData = env match { case "local" => EnvData("x", "a") case _ => //etc } 一样使用它等等。