如何在Scala中使用开关/shell(简单模式匹配)?
我发现自己陷在了一件很平凡的事情上: – ]
我有一个枚举:
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 }
这给了我一个“无法访问的代码”编译器错误的每个分支,但无论是第一个(“案例FOO => 4在这种情况下)。 我究竟做错了什么?
我怀疑你实际使用的代码不是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 }
下面的代码适合我:它生成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)) } }
你能说这和你的问题有什么不同吗?