理解没有 case class 的 unapply

4

我正在尝试以下示例来理解unapply

class Emp(name: String, age: Int)

object Emp {
  def apply(name: String, age: Int): Emp = new Emp(name, age)

  def unapply(emp: Emp): Option[(String, Int)] = Some(emp.name, emp.age)
}

很不幸,它在编译时出现了错误 Cannot resolve symbol nameCannot resolve symbol age

然而,当我将Emp声明为case类时,它可以完美地工作,没有任何编译错误。

有人能够解释一下这背后的原因吗?

注:scala版本- 2.12.7

1个回答

5

这个错误告诉你,Scala无法在类 Emp 中看到属性。要让它们可见,你需要像这样做(有关更多信息,请参见此处):

class Emp(val name: String, val age: Int)

此外,Some 只接受一个参数,因此您需要返回一对值:
Some((emp.name, emp.age))

对的...需要使用val声明它以在类外部公开。 - mukesh210
1
@Mukeshprajapati Scala类的行为与Java类相似,需要使用getter和setter才能访问它们的参数。将它们声明为“val”似乎可以绕过此要求,同样地,将类声明为“case class”也可以。 - James Whiteley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接