如何在 Scala 中使用 switch/case(简单模式匹配)?
Posted
技术标签:
【中文标题】如何在 Scala 中使用 switch/case(简单模式匹配)?【英文标题】:How to use switch/case (simple pattern matching) in Scala? 【发布时间】:2011-04-08 00:54:33 【问题描述】:我发现自己陷入了一件非常琐碎的事情:-]
我有一个枚举:
object Eny extends Enumeration
type Eny = Value
val FOO, BAR, WOOZLE, DOOZLE = Value
在代码中,我必须有条件地将其转换为数字(varianr-number 对应关系因上下文而异)。我写:
val en = BAR
val num = en match
case FOO => 4
case BAR => 5
case WOOZLE => 6
case DOOZLE => 7
这给了我每个分支的“无法访问的代码”编译器错误,但无论是第一个分支(在这种情况下为“case FOO => 4”)。我做错了什么?
【问题讨论】:
我的猜测是“en”是“val”并分配给“BAR”。以后不能重新分配,因此在声明后的任何地方都等于 BAR。 这是一个简化的例子,在实际程序中“en”是一个函数的输入参数。它确实不能在内部重新分配,但可能因调用而异。 在这种情况下,也许您可以举一个不太简单的例子?就目前而言,答案是它给出了“无法访问的代码”错误,因为存在无法访问的代码。 我无法复制您报告的错误。我拿了你的代码,没有改变,把它放在一个对象中并编译它。你提交给 REPL 了吗? @Ivan - 发布您的实际代码!我怀疑你很快就会得到解决方案! 【参考方案1】:我怀疑您实际使用的代码不是FOO
,而是foo
,小写,这将导致Scala 将值分配给foo
,而不是与它进行比较。
换句话说:
x match
case A => // compare x to A, because of the uppercase
case b => // assign x to b
case `b` => // compare x to b, because of the backtick
【讨论】:
谢谢。我该怎么做才能使用小写的枚举值? @Ivan:将它们放在反引号中,如他的第三个示例所示。【参考方案2】:以下代码对我来说很好用:它产生 6
object Eny extends Enumeration
type Eny = Value
val FOO, BAR, WOOZLE, DOOZLE = Value
import Eny._
class EnumTest
def doit(en: Eny) =
val num = en match
case FOO => 4
case BAR => 5
case WOOZLE => 6
case DOOZLE => 7
num
object EnumTest
def main(args: Array[String]) =
println("" + new EnumTest().doit(WOOZLE))
您能说说这与您的问题有何不同吗?
【讨论】:
在我的真实代码中,我必须使用小写字母。丹尼尔说这就是问题所在。我永远不会认为这很重要。 @pagoda_5b 2ns 链接已失效。有人在某个地方打捞过它吗? @Arioch'对于丢失的链接,我深表歉意。我想这个主题对于 SO 格式来说太笼统了。我目前没有替代品。以上是关于如何在 Scala 中使用 switch/case(简单模式匹配)?的主要内容,如果未能解决你的问题,请参考以下文章