gpt4 book ai didi

scala - scala 'match' 编译规则的误解

转载 作者:行者123 更新时间:2023-12-02 10:40:38 25 4
gpt4 key购买 nike

我一定对 Scala 的“匹配”语义或编译器逻辑有一些基本的误解。这段代码:

val stageStart:Int = 0
val stageShutDown:Int = Int.MaxValue
val stageErrorReport:Int = Int.MinValue

def stageString(stage:Int):String = stage match {
case stageStart => "Start"
case stageShutDown => "End"
case stageErrorReport => "Error"
case _ => "Step " + String.valueOf(stage)
}

在最后 3 个“case”语句中导致“Unreachable Code”错误?如果您用实际值(0、Int.MaxValue、Int.MinValue)代替名称,它会编译——但现在我已经硬编码了应该由它们的名称引用的值(出于所有通常的原因)。既然 'val' 永远不会改变,那么第一个版本不应该也有效吗?

最佳答案

有一个微妙而重要的特征:如果case 中的标识符规则以小写字母开头,它们总是被视为 变量 .所以第一个case始终匹配(将 stage 存储到变量 stageStart 中),其余 3 个无法访问。您需要用大写字母定义常量

val StageStart:Int = 0
val StageShutDown:Int = Int.MaxValue
val StageErrorReport:Int = Int.MinValue

def stageString(stage:Int):String = stage match {
case StageStart => "Start"
case StageShutDown => "End"
case StageErrorReport => "Error"
case _ => "Step " + String.valueOf(stage)
}

然后它们不会被视为变量,而是作为模式匹配的常量。

另见 this answerNaming convention for Scala constants?

关于scala - scala 'match' 编译规则的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12184172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com