为什么 Value String 即使定义为 val 也不是稳定的标识符
Why is Value String not a stable identifier even when defined as a val
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
这 returns 个案例错误 ->
HydraQueueWorker.scala:58:需要稳定标识符,但 HydraTable.MpesaTable.toString 已找到。
这些值不是稳定的标识符吗?
toString
是一种方法,它的调用每次都可以产生不同的值:您可以轻松地创建一个案例 class 并将 toString
覆盖为 return随机整数的字符串值
如果您查看 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
因此您可以创建您的枚举,覆盖它并return一个随机值。
您可以像这样匹配枚举
matchTable match {
case HydraTable.PaypalTable => ???
}
如果您想使用枚举的字符串值,您可以创建一个提取器
object TableNameExctractor {
def unapply(table: HydraTable.Value): Option[String] = Some(table.toString)
}
你的比赛看起来像这样
matchTable match {
case TableNameExctractor(tableName) => ???
}
您的路径中的任何地方都不能有 var
或 def
。这适用于编译器为路径中的项目推断的当前类型。
例如:
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
}
}
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
这 returns 个案例错误 -> HydraQueueWorker.scala:58:需要稳定标识符,但 HydraTable.MpesaTable.toString 已找到。
这些值不是稳定的标识符吗?
toString
是一种方法,它的调用每次都可以产生不同的值:您可以轻松地创建一个案例 class 并将 toString
覆盖为 return随机整数的字符串值
如果您查看 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
因此您可以创建您的枚举,覆盖它并return一个随机值。
您可以像这样匹配枚举
matchTable match {
case HydraTable.PaypalTable => ???
}
如果您想使用枚举的字符串值,您可以创建一个提取器
object TableNameExctractor {
def unapply(table: HydraTable.Value): Option[String] = Some(table.toString)
}
你的比赛看起来像这样
matchTable match {
case TableNameExctractor(tableName) => ???
}
您的路径中的任何地方都不能有 var
或 def
。这适用于编译器为路径中的项目推断的当前类型。
例如:
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
}
}