gpt4 book ai didi

scala - 为什么我不能对非案例类应用模式匹配?

转载 作者:行者123 更新时间:2023-12-05 00:41:11 27 4
gpt4 key购买 nike

还有比“这就是它的工作原理”更好的解释吗?我的意思是我试过这个:

class TestShortMatch[T <: AnyRef] {
def foo(t: T): Unit = {
val f = (_: Any) match {
case Val(t) => println(t)
case Sup(l) => println(l)
}
}

class Val(t: T)
class Sup(l: Number)
}

和编译器投诉:

无法解析符号“Val”无法解析符号'Sup'

当然,如果我在每个类之前添加 case 它将正常工作。但原因是什么?编译器会做一些优化并生成特定的字节码吗?

最佳答案

原因是双重的。模式匹配只是使用 extractors 的语法糖。和 case classes碰巧免费给你几个方法,其中一个是对应于主构造函数的提取器方法。


如果您希望上面的示例正常工作,您需要在对象 ValSup 中定义一个 unapply 方法。为此,您需要提取器方法(仅在 val 字段上定义,因此您必须将字段设为 vals):

class Val[T](val t: T)
class Sup(val l: Number)

object Val {
def unapply[T](v: Val[T]): Option[T] = Some(v.t)
}
object Sup {
def unapply(s: Sup): Option[Number] = Some(s.l)
}

你可以在哪一点做类似 val Val(v) = new Val("hi") 的事情。不过,通常情况下,最好将您的类设为 case 类。然后,您应该定义额外的提取器。

通常的例子(我似乎找不到引用)是坐标:

case class Coordinate(x: Double, val: Double)

然后您可以定义一个自定义提取器,例如

object Polar {
def unapply(c: Coordinate): Option[(Double,Double)] = {...}
}
object Cartesian {
def unapply(c: Coordinate): Option[(Double,Double)] = Some((c.x,c.y))
}

转换为两种不同的表示形式,全部在模式匹配时进行。

关于scala - 为什么我不能对非案例类应用模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38853449/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com