选项上的Scala模式匹配

时间:2015-08-10 21:27:08

标签: scala pattern-matching optional

我看了The Neophyte's Guide to Scala Part 5: The Option Type,他提出了一种匹配选项的方法。我在这里实施了他的建议:

s3Bucket match {
  case Some(bucket) =>
    bucket.putObject(partOfKey + key + file.getName, file)
    true
  case None =>
    false
}

但我对它的实际效果有一些疑问。也就是说,由于s3Bucket的类型为Option[Bucket]case Some(bucket)如何将s3Bucket展开到bucket?引擎盖下到底发生了什么?

1 个答案:

答案 0 :(得分:6)

简短的回答是:提取器。

什么是提取器?我不会在这里详细介绍,但是 - 简而言之,提取器是一种能够解析类型实例,从中提取值的方法。

在scala中为A方法提供此签名的任何unapply

def unapply(object: A): Option[B]

可用于模式匹配,如果匹配成功,它将提取类型B的值。

您可以在线阅读有关此机制的大量资源。丹尼尔·韦斯特海德(Daniel Westheide)就是blog post这个好人。

回到你的问题,SomeNone都提供unapply方法,因为它是案例类(自动扩展Product),所以它们可以是用于模式匹配。

粗略的实现非常类似于:

object Some {
  def unapply[A](a: Some[A]) = Some(a.get)
}

object None {
  def unapply(object: None) = None
}