【问题标题】:Scala case classes and constructorsScala 案例类和构造函数
【发布时间】:2016-06-22 23:00:48
【问题描述】:

我发现自己编写了很多(某种)样板代码。例如说我有以下特征

trait Foo {
  def x: Int
}

trait Bar {
  def y: Boolean
  def z: String
}

然后我想要一个不多或少实现这些的案例类。

case class MyClass(x: Int, y: Boolean, z: String) extends Foo with Bar

这似乎并不烦人,但现在想象一下,我的特征每个都有一打 defs,并且名称 xyz 要长得多。写出案例类意味着我必须将所有这些重写为MyClass 的参数。

有没有办法根据我扩展的特征自动生成x: Int, y: Boolean, z: String 构造函数部分?

【问题讨论】:

  • 好吧,您可以使用案例类中的 def 覆盖 def。在这种情况下,您不必首先生成这些 val。您的 trait 的所有实现是否也有其 def 的 val 实现?如果是这种情况,那么为什么首先将其作为 def 而不是 val?
  • @tkachuko 假设我到处都有val 而不是def,这有什么帮助?
  • 它有助于进入您尝试解决的上下文。你需要某种宏工具:你检查过这里提到的库吗:stackoverflow.com/questions/22850340/…

标签: scala


【解决方案1】:

我认为您正在寻找可以为您处理这项工作的annotation macro。然后,您可以通过编写如下代码来调用此宏:

@FieldsFromTraits
case class MyClass extends Foo with Bar

注释宏然后可以使用来自特征的信息重写您的案例类。

做类似事情的库是MetaRest。您可能会尝试调整该实现。我会看看今晚我能不能把东西放在一起。

【讨论】:

  • 哇!这正是我所想的。我想我会尝试调整该实现。
猜你喜欢
  • 2013-12-30
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2011-11-09
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
相关资源
最近更新 更多