class - 我可以在 Scala 匹配语句中使用类变量吗?

标签 class scala

假设我有这样的东西:

obj match {
    case objTypeOne : TypeOne => Some(objTypeOne)
    case objTypeTwo : TypeTwo => Some(objTypeTwo)
    case _ => None
}

现在我想概括一下,传入一种类型来匹配:

obj match {
    case objTypeOne : clazz => Some(objTypeOne)
    case objTypeTwo : TypeTwo => Some(objTypeTwo)
    case _ => None
}

但这是不允许的,我认为是出于句法而不是语义的原因(尽管我也猜测即使 clazz 是 Class[C] 类型也会被删除,因此 Option 的类型将丢失)。

我最终得到了:

if(clazzOne.isAssignableFrom(obj.getClass)) Some(clazz.cast(obj))
if(obj.isInstanceOf[TypeTwo]) Some(obj.asInstanceOf[TypeTwo])
None

我只是想知道是否有更好的方法。

最佳答案

您可以定义一个提取器来匹配您的对象:

class IsClass[T: Manifest] {
  def unapply(any: Any): Option[T] = {
    if (implicitly[Manifest[T]].erasure.isInstance(any)) {
       Some(any.asInstanceOf[T])
    } else {
       None
    }
  }
}

那么让我们测试一下:

class Base { def baseMethod = () }
class Derived extends Base

val IsBase = new IsClass[Base]

def test(a:Any) = a match {
    case IsBase(b) => 
      println("base")
      b.baseMethod
    case _ => println("?")
  }

test(new Base)
test(1)

您必须为提取器定义一个 val,例如,您不能内联 IsBase。否则它将被解释为提取器。

关于class - 我可以在 Scala 匹配语句中使用类变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4105328/

相关文章:

objective-c - 在 Cocoa Objective C 中的类之间发送数据

scala - 灵活的查询过滤器作用于任意列

scala - 类似的Try block 尝试/最终在Scala中阻止

scala - Spark Scala withColumn getItem

java - 在方法中使用 'var' 是否会使执行(并发)线程不安全?

Python 和 OO 编程(类属性和派生类)

javascript - 通过 jQuery 添加类

如果 Bootstrap 选项卡未处于事件状态,jQuery 将删除一个 div

正则表达式模式匹配在 scala.js 中不起作用?

swift : Unexpectedly found nil