gpt4 book ai didi

scala - 使用 def 宏实现抽象方法

转载 作者:行者123 更新时间:2023-12-04 17:50:46 24 4
gpt4 key购买 nike

通过 def 宏实现抽象方法似乎是不可能的:

import scala.reflect.macros.Context
import language.experimental.macros

trait A {
def foo(): Unit
}

object AImpl {
def fooImpl(c: Context)(): c.Expr[Unit] = {
import c.universe._
c.Expr[Unit](reify().tree)
}
}
trait AImpl extends A {
def foo(): Unit = macro AImpl.fooImpl
}

这失败并出现以下错误:
[error] .../A.scala:17: overriding method foo in trait A of type ()Unit;
[error] macro method foo cannot override an abstract method
[error] def foo(): Unit = macro AImpl.fooImpl
[error] ^

如果我删除 extends A它编译。但显然我想要 AImpl满足特质 A .如何解决这个问题?

另一个尝试:
trait AImpl extends A {
def foo(): Unit = bar()
def bar(): Unit = macro AImpl.fooImpl
}

给出新错误:
[error] macro implementation not found: bar (the most common reason for that is that
you cannot use macro implementations in the same compilation run that defines them)
[error] one error found

最佳答案

您确定您使用首先编译的宏和 AImpl 进行了测试吗?之后?

使用像第二次尝试这样的转发器方法似乎有效(使用 2.10.2):

// first compilation run

import scala.reflect.macros.Context
import language.experimental.macros

trait A {
def foo(): Unit
}

object AImplMacros {
def fooImpl(c: Context)(): c.Expr[Unit] = {
import c.universe._
c.Expr[Unit](reify().tree)
}
}

// second compilation run

trait AImpl extends A {
def foo(): Unit = bar()
def bar(): Unit = macro AImplMacros.fooImpl
}

// compiles and runs:

scala> val a = new AnyRef with AImpl
a: AImpl = $anon$1@59225446

scala> a.foo

scala> a.bar

关于scala - 使用 def 宏实现抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17150112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com