在某些用例中,创建对象的副本很有用,该对象是一组案例类的案例类的实例,它们具有共同的特定值.
例如,让我们考虑以下案例类:
case class Foo(id: Option[Int])
case class Bar(arg0: String, id: Option[Int])
case class Baz(arg0: Int, id: Option[Int], arg2: String)
Run Code Online (Sandbox Code Playgroud)
然后copy
可以在每个案例类实例上调用:
val newId = Some(1)
Foo(None).copy(id = newId)
Bar("bar", None).copy(id = newId)
Baz(42, None, "baz").copy(id = newId)
Run Code Online (Sandbox Code Playgroud)
type Copyable[T] = { def copy(id: Option[Int]): T }
// THIS DOES *NOT* WORK FOR CASE CLASSES
def withId[T <: Copyable[T]](obj: T, newId: Option[Int]): T =
obj.copy(id = newId)
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个scala宏,它完成了这项工作(几乎):
import scala.reflect.macros.Context
object Entity {
import …
Run Code Online (Sandbox Code Playgroud)