如何在Scala控制台中使用宏?Scala 3控制台报错咨询
在Scala 3控制台中使用宏的正确方式
你遇到的No given instance of type quoted.Quotes错误,本质是Scala 3的宏API(比如Expr)依赖编译时的Quotes上下文,这个上下文不会自动出现在控制台的顶级作用域中,只有在宏定义内部或通过inline方法触发宏展开时才会被注入。
要在Scala 3控制台中使用宏相关API,需要按以下步骤操作:
- 导入宏所需的核心包:
import scala.quoted._ import scala.compiletime._
- 定义一个
inline方法作为宏的入口,它会触发宏代码的编译时展开:
inline def createAndShowExpr(s: String): Unit = ${ createAndShowExprImpl('s) }
- 编写宏的实现方法,这个方法会自动获得
Quotes隐式上下文,在这里可以安全使用Expr相关操作:
def createAndShowExprImpl(s: Expr[String])(using Quotes): Expr[Unit] = '{ println("Expr内容: " + ${s}.show) }
- 调用
inline方法触发宏执行:
createAndShowExpr("Hello")
执行后会输出:Expr内容: "Hello",说明Expr实例已成功创建并处理。
如果只是想在控制台中测试Expr的基础操作,所有涉及Expr或Quotes的代码必须放在宏实现方法中,再通过inline方法触发——因为只有在宏展开阶段,编译器才会提供所需的Quotes上下文。
内容的提问来源于stack exchange,提问作者Pedro O S
相关产品推荐
相关产品推荐

