scala - 抽象 case 类的隐式 val

标签 scala

当我在 Scala 中使用案例类编写程序时,我遇到了一个反复出现的模式,我想将案例类的创建者作为参数供将来引用。我了解到我们可以通过将隐式值赋给案例类来捕捉这种模式

abstract class MessageCreator
case class SomeMessage(s:String)(implicit val creator:MessageCreator)
class MyCreator extends MessageCreator { implicit val creator = this}
class ACreator extends MyCreator { def newMessage = SomeMessage("hello") }

然后,这里的 newMessage 将有成员 creator,它引用 ACreator 本身的一个实例。

现在,我有一堆案例类可以做同样的事情。我的问题是,每次我想定义这样的案例类时,您如何重复这种模式而不必复制和粘贴 (implicit val creator:MessageCreator)

我尝试用隐式 val 定义一个抽象类,然后从案例类继承它们,但是 Scala 提示抽象类的隐式 val 没有在案例类中定义。显然,case类是不能被继承的。

如果这不能以编程方式完成,我可能会开始考虑编写一个宏(这将是一个很好的解决方案)。我想确保我没有遗漏任何东西。

最佳答案

在不了解更多关于它的域的情况下,我会问一些问题:

  1. 为什么你的工厂不能成为你的伴生对象?对于案例类,由于语言和它的编译器,这已经是明确的。如果您需要另一个,我会重载应用程序。

  2. 为什么你的类(class)需要有能力创造更多的自己?这不是“复制”的部分目的吗(我所说的部分是指没有替换所有字段。)

我问这些问题的季节是,在没有上下文的情况下,听起来你引入了额外的复杂性而没有太多好处。

最后,如果您要隐式传递状态,我会警告您不要这样做。这可能会导致各种问题。隐式是很棒的,除非它们导致错误,在这种情况下,错误变得难以破译和追踪。我几乎要说你应该只对类型类使用隐式

关于scala - 抽象 case 类的隐式 val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16937241/

相关文章:

scala - 如何使用 shapeless 在 Scala 列表中拆分

scala - 在整个项目中自动导入

scala - 列出 Slick 表格上的列

scala - 在Scala中重复列表

scala - SBT 项目中的 "resources"文件夹有什么用?

scala - 绝对函数

scala - 如何根据分配的优先级选择最重要的行?

scala - VS Code 在集成控制台中执行当前行或选择

scala - 协变类型 A 出现在值 a 的类型 A 中的逆变位置

vim - 有没有人让 vim taglist 插件与 Scala 一起工作?