首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在性状中使用未定义的

在性状中使用未定义的
EN

Stack Overflow用户
提问于 2021-12-23 06:33:30
回答 2查看 91关注 0票数 0

我有一个特点

代码语言:javascript
复制
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)
    }
}

这里的问题是,如果不创建一个提取器对象,我就不能使用在该特性中定义的未应用程序。

我想用这个特性覆盖不同对象中的getString方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-23 12:54:47

您可以使用自我类型来引用自己。

代码语言:javascript
复制
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
    }
}

就像预期的那样。

运行https://scastie.scala-lang.org/BalmungSan/MnpHz3HGSKSerX5sSoVwaw的代码。

票数 5
EN

Stack Overflow用户

发布于 2021-12-23 06:35:29

我用的一个解决办法是

代码语言:javascript
复制
trait A {
    def doSomething(a: Seq[Int]): Seq[String] = {
        a.map {
            case Extractor(s) => s
            case _ => "idc"
        }
    }
    
    object Extractor {
        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))); // Output: List(one, two, three, four, idc)
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70458471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档