我看了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
?引擎盖下到底发生了什么?
答案 0 :(得分:6)
简短的回答是:提取器。
什么是提取器?我不会在这里详细介绍,但是 - 简而言之,提取器是一种能够解析类型实例,从中提取值的方法。
在scala中为A
方法提供此签名的任何unapply
def unapply(object: A): Option[B]
可用于模式匹配,如果匹配成功,它将提取类型B
的值。
您可以在线阅读有关此机制的大量资源。丹尼尔·韦斯特海德(Daniel Westheide)就是blog post这个好人。
回到你的问题,Some
和None
都提供unapply
方法,因为它是案例类(自动扩展Product
),所以它们可以是用于模式匹配。
粗略的实现非常类似于:
object Some {
def unapply[A](a: Some[A]) = Some(a.get)
}
object None {
def unapply(object: None) = None
}