【问题标题】:Identify that an Any is actually a scala enumeration value确定 Any 实际上是一个 scala 枚举值
【发布时间】:2015-05-01 08:29:05
【问题描述】:

我有一个字符串格式化函数fmt(v:Any): String,它需要根据v 的运行时类型执行不同的操作。所以它看起来像:

def fmt(v:Any): String = {
  v match {
    case a: Int => "Int: " + a
    case a: String => "\"" + a + "\""
    case a => throw new IllegalArgumentException(s"??? '$a', ${a.getClass.getCanonicalName}?!")
  }
}

当我传入 scala 枚举值时,这会引发 IllegalArgumentException("??? 'myVal', scala.Enumeration.Val?!")。但是,添加一个

case a: scala.Enumeration.Val => "Hello enum"

不编译:object Enumeration 不是包 scala 的成员 注意:Enumeration 类存在,但没有伴生对象。

如何检测传入的实例是scala枚举值?

if (a.getClass.getCanonicalName == "scala.Enumeration.Val") 应该可以工作,但感觉就像一个 hack - 我可以做任何实际类型的模式匹配吗?

【问题讨论】:

    标签: scala enums


    【解决方案1】:

    你犯了两个错误。首先,枚举的公共 API 的类的名称是 Value 而不是 Val。其次,当引用内部类时,您使用# 而不是.。后者表示特定实例的内部类;前者的意思是“对于某些Enumeration,我不在乎,这是其内部类Value的一个实例”)。

    所以,写成这样:

    case a: scala.Enumeration#Value => "Hello, enum!"
    

    如果您实际上的意思是您需要知道它何时是受保护的实现类 Val 而不是面向公众的 Value,那么您不能轻易地知道,因为它是受保护的。它应该是一个实现细节。但是您可以将匹配项放在扩展 Enumeration 的内容中,然后您可以在Val 获得。 (使用# 表示法。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2012-11-11
      • 2022-08-03
      • 1970-01-01
      • 2022-11-17
      • 2020-12-03
      相关资源
      最近更新 更多