Scala 模式匹配选项

Scala Pattern Matching on Option

我读了 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
}

但我对它的实际工作原理有一些疑问。即,由于 s3BucketOption[Bucket] 类型,case Some(bucket) 如何将 s3Bucket 展开为 bucket?幕后到底发生了什么?

简短的回答是:提取器。

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

在 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
}