【问题标题】:Scala Pattern Matching on OptionScala 模式匹配选项
【发布时间】:2015-08-10 21:27:07
【问题描述】:

我阅读了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
}

但我对它的实际运作方式有一些疑问。即,既然s3BucketOption[Bucket] 类型,那么case Some(bucket) 如何将s3Bucket 解包成bucket?到底发生了什么?

【问题讨论】:

  • 您还应该阅读他的系列文章中的提取器。第一篇文章danielwestheide.com/blog/2012/11/21/…
  • @maks 谢谢!我读了一本 Scala 教科书来学习 Scala,所以我并没有真正阅读这些文章,我只是将它们作为参考。我现在就通读一遍。

标签: scala pattern-matching optional


【解决方案1】:

简短的回答是:提取器。

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

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

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

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

您可以在网上阅读有关此机制的大量资源。 Daniel Westheide 的 blog post 是一个不错的选择。

回到你的问题,SomeNone 都提供了一个 unapply 方法,因为它们是案例类(自动扩展 Product),因此它们可以用于模式匹配。

一个粗略的实现很像:

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

object None {
  def unapply(object: None) = None
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 2021-12-17
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多