"需要稳定的标识符"对于枚举类

时间:2016-04-08 21:02:44

标签: scala

在以下代码段中,

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语句中替换字符串的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

函数调用不能用作stable identifier pattern(即它不是stable identifier)。

特别是:

  

路径是以下之一。

     
      
  • 空路径ε(无法在用户中明确写入)   程式)。

  •   
  • C.this,其中C引用了一个类。这是路径   作为C.this的简写,其中C是该类的名称   直接附上参考文献。

  •   
  • p.x其中p是路径,x是路径   p的稳定成员。稳定的成员是包或成员   由对象定义或值的定义引入   非易失性类型。

  •   
  • C.super.xC.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 => ???
}