我想编写一个Scala宏,它将一个case类的实例作为参数.可以传递给宏的所有对象都必须实现特定的标记特征.
以下代码段显示了标记特征和实现它的两个示例案例类:
trait Domain
case class Country( id: String, name: String ) extends Domain
case class Town( id: String, longitude: Double, latitude: Double ) extends Domain
Run Code Online (Sandbox Code Playgroud)
现在,我想使用宏编写以下代码,以避免运行时反射的严重性及其线程不安全:
object Test extends App {
// instantiate example domain object
val myCountry = Country( "CH", "Switzerland" )
// this is a macro call
logDomain( myCountry )
}
Run Code Online (Sandbox Code Playgroud)
宏logDomain在不同的项目中实现,看起来类似于:
object Macros {
def logDomain( domain: Domain ): Unit = macro logDomainMacroImpl
def logDomainMacroImpl( c: Context )( domain: c.Expr[Domain] ): c.Expr[Unit] = { …Run Code Online (Sandbox Code Playgroud)