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
}
但我对它的实际工作原理有一些疑问。即,由于 s3Bucket
是 Option[Bucket]
类型,case Some(bucket)
如何将 s3Bucket
展开为 bucket
?幕后到底发生了什么?
简短的回答是:提取器。
什么是提取器?我不会在这里详细介绍,但是 - 简而言之 - 提取器是一种能够解构类型实例并从中提取值的方法。
在 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
}
我读了 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
?幕后到底发生了什么?
简短的回答是:提取器。
什么是提取器?我不会在这里详细介绍,但是 - 简而言之 - 提取器是一种能够解构类型实例并从中提取值的方法。
在 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
}