【问题标题】:Is there a way to use pattern matching in build.sbt?有没有办法在 build.sbt 中使用模式匹配?
【发布时间】:2015-04-25 11:47:38
【问题描述】:

我正在尝试使用 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 文件中使用 match 语句?该错误表明它在 val 语句中不受支持。它实际支持在哪里?


编辑:

我也尝试向 build.scala 对象添加方法,但即使我使用普通 if 语句,我仍然得到相同的“不支持 val 语句中的模式匹配”

构建.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)

但无济于事。

【问题讨论】:

    标签: scala build pattern-matching sbt


    【解决方案1】:

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

    val (someVar, otherVar) = ...
    

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

    这是来自SbtParser implementation的相关评论

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


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

    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 等一样使用它。

    【讨论】:

    • 谢谢!这行得通,我需要在 Build.scala 文件而不是 build.sbt 中定义案例类才能让它工作
    • 另一种选择是在build.sbt中继续使用一个元组,然后将其解构为2个值,分别为_1和_2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多