[英]Scala Pattern Matching on Option
我阅读了新手的Scala指南第5部分:选项类型 ,他建议了一种匹配选项的方法。 我在这里实施了他的建议:
s3Bucket match {
case Some(bucket) =>
bucket.putObject(partOfKey + key + file.getName, file)
true
case None =>
false
}
但我对它的实际运作方式有一些疑问。 也就是说,由于s3Bucket
的类型为Option[Bucket]
,如何将case Some(bucket)
解s3Bucket
到bucket
? 引擎盖下究竟发生了什么?
简短的回答是:提取器。
什么是提取器? 我不会在这里详细介绍,但是 - 简而言之,提取器是一种能够解析类型实例,从中提取值的方法。
在scala中任何A
使用此签名提供unapply
方法的A
def unapply(object: A): Option[B]
可以在模式匹配中使用,如果匹配成功,它将提取类型B
的值。
您可以在线阅读有关此机制的大量资源。 Daniel Westheide撰写的这篇博客文章很好。
回到你的问题, Some
和None
都通过case case(自动扩展Product
)提供了一个unapply
方法,因此它们可以用于模式匹配。
粗略的实现非常类似于:
object Some {
def unapply[A](a: Some[A]) = Some(a.get)
}
object None {
def unapply(object: None) = None
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.