Scala中如何使用模式匹配处理Option类型的数据

5

我阅读了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
你还应该阅读他的一系列文章中关于提取器的内容。这是第一篇文章:http://danielwestheide.com/blog/2012/11/21/the-neophytes-guide-to-scala-part-1-extractors.html - maks
@maks 谢谢!我读了一本Scala教材来学习Scala,所以我实际上没有阅读这些文章,只是把它们作为参考。现在我会仔细阅读它们的。 - jstnchng
1个回答

8
答案很简单:提取器。
什么是提取器?我不会在这里详细介绍,但简而言之,提取器是一种能够解构类型实例并从中提取值的方法。
在Scala中,任何提供具有以下签名的Aunapply方法的类型
def unapply(object: A): Option[B]

如果匹配成功,可以在模式匹配中使用它来提取类型为 B 的值。

网络上有很多关于这种机制的资源可供阅读。其中一个好的资源是 Daniel Westheide 的这篇博客文章

回到你的问题,SomeNone 都通过作为 case 类(自动扩展 Product)提供了一个 unapply 方法,因此它们可以用于模式匹配。

一个简单的实现大致如下:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接