【问题标题】:Why can't I reuse "unapply" without repeating the method signature为什么我不能在不重复方法签名的情况下重用“取消应用”
【发布时间】:2017-12-09 13:28:40
【问题描述】:

以下 Scala 代码编译良好:

val f = (input: String) => Some("result")
object Extract {
   def unapply(input: String): Option[String] = f(input)
}
val Extract(result) = "a string"

但如果我将提取器替换为:

object Extract {
   def unapply = f
}

然后编译失败:

error: an unapply result must have a member `def isEmpty: Boolean
val Extract(result) = "a string"
    ^

为什么? def isEmpty: Boolean来自哪里?

【问题讨论】:

  • 我想,我们中的一些人只是喜欢嵌套......如果是Seq[Seq[Seq[Seq[Seq[Int]]]]呢?

标签: scala extractor unapply


【解决方案1】:

回答您的第一个问题 - isEmpty 来自 Option 类型的内部。

def unapply = f 表示 - 创建一个返回函数的无参数方法。这本身不是一种方法,因此您有错误。

您可以在此处进一步了解 Scala 中函数和方法之间的区别:Difference between method and function in Scala

【讨论】:

  • "这本身不是一个方法" 你是什么意思? unapply 是; f 不是,但它不相关。
  • @AlexeyRomanov 我的意思是 unapply 在这种情况下不是带有 f 签名的方法。这是一个返回函数的方法
【解决方案2】:

在 Scala 2.10(及之前)中,unapply 必须始终返回 OptionBoolean。从 2.11 开始,它可以返回任何类型,只要它有 def isEmpty: Booleandef get: <some type> 方法(就像 Option 一样)。请参阅 https://hseeberger.wordpress.com/2013/10/04/name-based-extractors-in-scala-2-11/ 了解它为何有用的说明。 但是你的unapply 返回一个String => Some[String],它没有,这就是错误所说的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    相关资源
    最近更新 更多