为什么即使定义为val,Value String也不是稳定的标识符

时间:2016-02-18 16:18:03

标签: scala spray spray-json

object HydraTable extends Enumeration {
  val UserTable, MpesaTable, ChequeTable, PaypalTable = Value
}

matchTable.tableType match {

  case HydraTable.UserTable.toString =>
    // do somet
  case HydraTable.MpesaTable.toString => 
    // do somet
    // returns error below

这会在案例中返回错误 - > HydraQueueWorker.scala:58:需要稳定的标识符,但找到了HydraTable.MpesaTable.toString。

值是不是稳定的标识符?

3 个答案:

答案 0 :(得分:4)

toString是一个方法,它的调用每次都可以产生不同的值:你可以轻松创建一个case类并覆盖toString以返回一个随机整数的字符串值

如果你看一下toString定义,就会发现它是一种方法(而非最后一种方法)

@SerialVersionUID(8476000850333817230L)
abstract class Enumeration (initial: Int) extends Serializable {
  thisenum =>

 def this() = this(0)

  /* Note that `readResolve` cannot be private, since otherwise
     the JVM does not invoke it when deserializing subclasses. */
  protected def readResolve(): AnyRef = thisenum.getClass.getField(MODULE_INSTANCE_NAME).get(null)

  /** The name of this enumeration.
   */
  override def toString =
    ((getClass.getName stripSuffix MODULE_SUFFIX_STRING split '.').last split
       Regex.quote(NAME_JOIN_STRING)).last

因此,您可以创建枚举,覆盖它并返回随机值。

答案 1 :(得分:1)

您的路径无法在其中的任何位置显示vardef。这适用于编译器推断路径中项目的当前类型。

例如:

object Obj0 {
   val field0 = "a"

   override val toString = "b"
}

object Obj1 {
   def field1 = Obj0
}

object Obj2 {
   val field2 = Obj0

   val field3 = Obj1

   val field4: Any = Obj0

   def thing = "c" match {
     case field2.field0 => "this is okay"
     case field3.field1.field0 => "" // compile error
     case field2.toString => "also okay"
     case field4.toString => "" // compile error
   }
}

答案 2 :(得分:0)

你可以匹配这样的枚举

matchTable match {
  case HydraTable.PaypalTable => ???
}

如果要使用枚举的String值,可以创建一个提取器

object TableNameExctractor {
  def unapply(table: HydraTable.Value): Option[String] = Some(table.toString)
}

你的比赛看起来像这样

matchTable match {
  case TableNameExctractor(tableName) => ???
}