如何在Scala中取消模式匹配中的类型?

谢尔格达

使用此代码,只会对指定的异常执行println。我想知道是否有可能使该行取反以使其对所有未指定的其他异常执行。我知道可以使用2种情况,但是我想知道是否可以用一种情况来完成。

val myHandler: PartialFunction[Throwable, Unit] = {
  case e @ (_: MappingException | _: ParseException | _: SomeOtherException) =>
   println("Got it")
}
西尔维奥·梅奥洛(Silvio Mayolo)

好了,您已经确定什么可能是易读的方法。

val myHandler: PartialFunction[Throwable, Unit] = {
  case e @ (_: MappingException | _: ParseException | _: SomeOtherException) =>
    throw e
  case _ =>
    println("Got it")
}

这可能就是我在实际生产代码中写的方式。这很明智,一目了然。

但是您要求一个案例,所以让我们开始吧。由于我们要检查几种类型,因此我们需要能够将它们表示为列表。有无数的Scala库可以使它更漂亮,但是出于我们的目的,我们只会推出自己的库。

trait TList {
  def isMember(x: Any): Boolean
}

object Nil extends TList {
  def isMember(x: Any) = false
}

case class Cons[H : ClassTag](val tail: TList) extends TList {
  def isMember(x: Any) = {
    x match {
      case _: H => true
      case _ => tail.isMember(x)
    }
  }
}

因此,我们可以表示经典的Lisp样式单链接列表,并检查Any列表中任何位置的任意值是否具有类型。现在让我们取反并编写一个unapply方法。

case class NotMember(val types: TList) {
  def unapply(elem: Any): Boolean =
    !types.isMember(elem)
}

然后我们的处理程序看起来像

val test = NotMember(
  Cons[MappingException](Cons[ParseException](Cons[SomeOtherException](Nil)))
)
val myHandler: PartialFunction[Throwable, Unit] = {
  case test() =>
    println("Got it")
}

同样,如果您确实想走这条路,那么您将需要获取一个库以使类型级的东西易于管理。但这绝对是可能的。唯一的问题是,在您的用例中是否值得?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Scala中对多个类型进行模式匹配?

来自分类Dev

如何在Spark Scala中处理模式匹配中的Null

来自分类Dev

Scala中通用类型的模式匹配

来自分类Dev

Scala - 模式匹配中的联合类型

来自分类Dev

如何在Scala中理解“与Singleton对象的模式匹配”?

来自分类Dev

如何在Scala中对功能进行模式匹配?

来自分类Dev

如何在Haskell中触发类型族模式匹配错误?

来自分类Dev

如何在Scala中修复此类型不匹配错误?

来自分类Dev

如何在shell中取消vim模式

来自分类Dev

如何在shell中取消vim模式

来自分类Dev

如何在scala中的foreach函数中的正则表达式上进行模式匹配?

来自分类Dev

Scala中通用抽象类型的模式匹配

来自分类Dev

是否可以在Scala中对类型进行模式匹配以进行表达?

来自分类Dev

Scala中的模式匹配时类型推断不正确

来自分类Dev

如何在Java中检查匹配模式

来自分类Dev

如何在 SML 中模式匹配 0.0?

来自分类Dev

如何在Scala中读取匹配模式的前一行?

来自分类Dev

如何在C#中对具有抽象内部类型的泛型进行模式匹配?

来自分类Dev

Scala中的模式匹配或isInstanceOf

来自分类Dev

模式匹配中的Scala Regex

来自分类Dev

Scala中POJO的模式匹配?

来自分类Dev

Scala:元组中的模式匹配

来自分类Dev

Scala 中奇怪的模式匹配

来自分类Dev

Spark Scala 中的模式匹配

来自分类Dev

Haskell中类型匹配的模式

来自分类Dev

Haskell中类型匹配的模式

来自分类Dev

如何在Scala中匹配Char?

来自分类Dev

如何模式匹配scala列表的头尾类型?

来自分类Dev

如何在Apple Watch中从模式搜索更改标签“取消”