我正在研究 Scala 2.12.17.
假设我有一堆案例类:
case class TestOne(one: String)
case class TestTwo(one: String, two: String)
case class TestThree(one: String, two: String, three: String)
我也有这些类型:
trait Data{
val a: Int
}
case class DoubleInt(a: Int, b: Int) extends Data
case class SingleInt(a: Int) extends Data
以及将
Data
对象转换为 String
的函数:
def loadData(input: Data): String = {
input.a.toString
}
我期待的是将
Data
对象传递给我的案例类的 apply 方法,然后 apply 方法将使用 loadData
函数来将每个传递的 Data
对象转换为 String
到创建我的案例类的实例。例如:
val dataOne: Data = SingleInt(1)
val dataTwo: Data = DoubleInt(1, 2)
val testOne = TestOne(dataOne)
val testTwo = TestTwo(dataOne, dataTwo)
val testThree = TestOne(dataOne, dataTwo, dataOne)
基本上,
TestOne
apply
方法是:
def apply(one: Data): TestOne = {
new TestOne(loadData(one))
}
TestTwo
apply
方法是:
def apply(one: Data, two: Data): TestTwo= {
new TestTwo(loadData(one), loadData(two))
}
有没有办法在编译时以编程方式生成这些应用方法?
我认为宏或天堂注释对这个用例很有用,但我对这些主题太缺乏经验,甚至不知道从哪里开始:/