作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个这样定义的案例类:
case class StreetSecondary(designator: String, value: Option[String])
object StreetSecondary {
//empty for now
}
tupled
方法可通过此隐式伴随对象在案例类 StreetSecondary 上使用。但是,一旦我定义了显式伴随对象,
tupled
方法是“丢失”的。
tupled
方法恢复。我希望恢复所有功能(例如,包括提取器/
unapply
)。
tupled
工作(谢谢 drstevens):
(StreetSecondary.apply _).tupled
虽然这解决了特定的
tupled
方法问题,它仍然没有准确或完整地描述 scala 编译器在隐式伴生对象中提供的内容。
object StreetSecondary extends ((String, Option[String]) => StreetSecondary) {
//empty for now
}
最佳答案
在为 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
}
extends ((String, Option[String]) => StreetSecondary)
在对象名称之后和第一个花括号之前插入。
override def toString = getClass.getName.split("""\$""").reverse.dropWhile(x => {val char = x.take(1).head; !((char == '_') || char.isLetter)}).head
插入到对象的主体中(显式实现仍然有问题)
关于scala - 如何为一个 case 类创建一个显式伴随对象,它的行为与被替换的编译器提供的隐式伴随对象相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25392422/
我是一名优秀的程序员,十分优秀!