选项上的Scala模式匹配

jst*_*hng 3 scala pattern-matching optional

我阅读了新手的Scala指南第5部分:选项类型,他建议了一种匹配选项的方法.我在这里实施了他的建议:

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

但我对它的实际运作方式有一些疑问.也就是说,由于s3Bucket是类型Option[Bucket],如何case Some(bucket)解开s3Bucketbucket?引擎盖下究竟发生了什么?

Gab*_*lla 6

简短的回答是:提取器.

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

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

def unapply(object: A): Option[B]
Run Code Online (Sandbox Code Playgroud)

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

您可以在线阅读有关此机制的大量资源.Daniel Westheide撰写的这篇博客文章很好.

回到你的问题,Some并且None既提供unapply由由于是case类(其自动扩展方法Product),所以它们可以在模式匹配中使用.

粗略的实现非常类似于:

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

object None {
  def unapply(object: None) = None
}
Run Code Online (Sandbox Code Playgroud)