繁体   English   中英

选项上的Scala模式匹配

[英]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)s3Bucketbucket 引擎盖下究竟发生了什么?

简短的回答是:提取器。

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

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

def unapply(object: A): Option[B]

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

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

回到你的问题, SomeNone都通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM