gpt4 book ai didi

scala - 如何为一个 case 类创建一个显式伴随对象,它的行为与被替换的编译器提供的隐式伴随对象相同?

转载 作者:行者123 更新时间:2023-12-04 11:51:45 27 4
gpt4 key购买 nike

我有一个这样定义的案例类:

case class StreetSecondary(designator: String, value: Option[String])

然后我定义一个 显式 伴生对象:
object StreetSecondary {
//empty for now
}

定义显式伴生对象 StreetSecondary 的行为导致编译器生成的“隐式伴生对象”丢失;即替换为无法访问编译器生成的版本。例如, tupled方法可通过此隐式伴随对象在案例类 StreetSecondary 上使用。但是,一旦我定义了显式伴随对象, tupled方法是“丢失”的。

那么,我需要对上述 StreetSecondary 显式伴生对象进行定义/添加/更改,以重新获得因替换编译器提供的隐式伴生对象而丢失的所有功能?我想要的不仅仅是 tupled方法恢复。我希望恢复所有功能(例如,包括提取器/ unapply)。

感谢您提供的任何方向/指导。

更新 1

我已经做了足够的搜索来发现几件事:

A) 显式伴随对象必须在其 case 类之前定义(至少在 Eclipse Scala-IDE WorkSheet 中是这种情况,并且代码在 IntelliJ IDE 的 WorkSheet 中不起作用,无论哪个先出现)。

B) 有一个技术诀窍可以强制 tupled工作(谢谢 drstevens): (StreetSecondary.apply _).tupled虽然这解决了特定的 tupled方法问题,它仍然没有准确或完整地描述 scala 编译器在隐式伴生对象中提供的内容。

C) 最后,可以定义显式伴随对象来扩展一个函数,该函数匹配主构造函数的参数签名并返回 case 类的实例。它看起来像这样:
object StreetSecondary extends ((String, Option[String]) => StreetSecondary) {
//empty for now
}

同样,我仍然不能准确或完整地描述 Scala 编译器在隐式伴随对象中提供的内容。

最佳答案

在为 case 类定义显式伴随对象时(从 Scala 2.11 开始),为了完全替换丢失的隐式伴随对象中编译器提供的功能,显式伴随对象的基本模板有两个要求:

要求:
1. 必须扩展一个函数定义,该函数定义由一个返回 case 类类型的元组(完全匹配 case 类构造函数参数的类型和顺序)组成
2. 必须重写 toString 函数以提供对象类名称(与关联案例类的名称相同)

这是“空”显式伴随对象的原始示例代码:

object StreetSecondary {
//empty for now
}

这是实现上述要求后的示例代码:
object StreetSecondary extends ((String, Option[String]) => StreetSecondary) {
//replace the toString implementation coming from the inherited class (FunctionN)
override def toString =
getClass.getName.split("""\$""").reverse.dropWhile(x => {val char = x.take(1).head; !((char == '_') || char.isLetter)}).head
}

为满足上述要求 1, extends ((String, Option[String]) => StreetSecondary)在对象名称之后和第一个花括号之前插入。

为满足上述要求 2, override def toString = getClass.getName.split("""\$""").reverse.dropWhile(x => {val char = x.take(1).head; !((char == '_') || char.isLetter)}).head插入到对象的主体中(显式实现仍然有问题)

深深感谢@drstevens 发布了 javap 输出以帮助我获得信心,以上两个步骤就是恢复丢失的功能所需的全部步骤。

关于scala - 如何为一个 case 类创建一个显式伴随对象,它的行为与被替换的编译器提供的隐式伴随对象相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25392422/

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