代码之家  ›  专栏  ›  技术社区  ›  jstnchng

选项上的Scala模式匹配

  •  5
  • jstnchng  · 技术社区  · 10 年前

    我读到了 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) 打开…的包装 s3铲斗 进入 bucket ? 引擎盖下面到底发生了什么?

    1 回复  |  直到 10 年前
        1
  •  8
  •   Gabriele Petronella    10 年前

    简单的答案是:提取器。

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

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

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

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

    网上有很多关于这个机制的资料。好的是这个 blog post 丹尼尔·韦斯特海德。

    回到你的问题, Some None 两者都提供了 不适用的 方法,因为它是case类(自动扩展 Product ),因此它们可以用于模式匹配。

    粗略的实现大致如下:

    object Some {
      def unapply[A](a: Some[A]) = Some(a.get)
    }
    
    object None {
      def unapply(object: None) = None
    }
    
    推荐文章