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

Is there a way to use pattern matching in build.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 对象添加一个方法,但即使我使用普通的 if 语句,我仍然得到相同的 "Pattern matching in val statements is not supported"

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)

但是没有用。

错误不是由match语句引起的,而是来自于:

val (someVar, otherVar) = ...

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

这是来自 SbtParser implementation

的相关评论

// Check No val (a,b) = foo or val a,b = foo as these are problematic to range positions and the WHOLE architecture.


您可以通过使用大小写 class 而不是元组来解决此限制。

Build.scala

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

build.sbt

val envData = env match {
    case "local" => EnvData("x", "a")
    case _ => //etc
}

然后像envData.someVarenvData.otherVar等那样使用。