在以下代码段中,
val line = ... // a list of String array
line match {
case Seq("Foo", ... ) => ...
case Seq("Bar", ... ) => ...
...
我将上述代码更改为以下内容:
object Title extends Enumeration {
type Title = Value
val Foo, Bar, ... = Value
}
val line = ... // a list of String array
line match {
case Seq(Title.Foo.toString, ... ) => ...
case Seq(Title.Bar.toString, ... ) => ...
...
而且,我收到一个错误:
stable identifier required, but com.abc.domain.enums.Title.Foo.toString found.
在case语句中替换字符串的正确方法是什么?
答案 0 :(得分:3)
函数调用不能用作stable identifier pattern(即它不是stable identifier)。
特别是:
路径是以下之一。
空路径
ε
(无法在用户中明确写入) 程式)。
C.this
,其中C
引用了一个类。这是路径 作为C.this的简写,其中C是该类的名称 直接附上参考文献。
p.x
其中p
是路径,x
是路径p
的稳定成员。稳定的成员是包或成员 由对象定义或值的定义引入 非易失性类型。
C.super.x
或C.super[M].x
其中C
引用一个类,x
引用一个稳定的超级成员M
的类或指定父类C
。超级前缀是采取的 作为C.super
的简写,其中C
是该类的名称 直接封闭参考。稳定标识符是一条路径 以标识符结尾。
因此,您不能在模式中使用xyz.toString
之类的函数调用。
要使其稳定,您可以将其指定给val
。如果标识符以小写字母开头,则需要将其括在反引号(`)中以避免影响它:
val line = Seq("Foo") // a list of String array
val FooString = Title.Foo.toString
val fooLowerCase = Title.Foo.toString
line match {
case Seq(FooString) => ???
// case Seq(fooLowerCase) (no backticks) matches any sequence of 1 element,
// assigning it to the "fooLowerCase" identifier local to the case
case Seq(`fooLowerCase`) => ???
}
你可以使用警卫:
line match {
case Seq(x) if x == Title.Foo.toString => ???
}