Cod*_*Man 0 scala pattern-matching unapply
我有一个特质
trait A {
def doSomething(a: Seq[Int]): Seq[String] = {
a.map {
case AA(s) => s // want to use unapply defined in trait (this(AA) not allowed)
case _ => "idc"
}
}
def unapply(a: Int): Option[String] = getString(a)
def getString(a: Int): Option[String] = {
a match {
case 1 => Some("one")
case 2 => Some("two")
case _ => None
}
}
}
object AA extends A
object AA2 extends A {
override def getString(a: Int): Option[String] = {
super.getString(a).orElse{
a match {
case 3 => Some("three")
case 4 => Some("four")
case _ => None
}
}
}
}
object MyClass {
def main(args: Array[String]) {
println(AA.doSomething(Seq(1,2,3,4,5))); // Output: List(one, two, idc, idc, idc)
println(AA2.doSomething(Seq(1,2,3,4,5))); // Expect Output: List(one, two, three, four, idc) but get List(one, two, idc, idc, idc)
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,如果不创建提取器对象,我就无法使用特征中定义的 unapply 。
我想使用此特征覆盖不同对象中的 getString 方法。
您可以使用 self 类型来引用您自己。
trait A { self =>
final def doSomething(a: Seq[Int]): Seq[String] =
a.map {
case self(s) => s
case _ => "idc"
}
final def unapply(a: Int): Option[String] =
getString(a)
def getString(a: Int): Option[String] =
a match {
case 1 => Some("one")
case 2 => Some("two")
case _ => None
}
}
Run Code Online (Sandbox Code Playgroud)
哪个按预期工作。
代码在这里运行。