scala - 在 Scala 3 宏中获取封闭模块
问题描述
如何获取宏调用的封闭模块。
package foo.bar
class MyClass:
val macroReturnValue = SomeMacro.macroCall("someExpression")
end MyClass
macroReturnValue
应该包含例如"foo.bar.MyClass"
解决方案
尝试
import scala.quoted.*
object SomeMacro:
inline def macroCall(s: String): String = ${macroCallImpl('s)}
def macroCallImpl(s: Expr[String])(using Quotes): Expr[String] =
import quotes.reflect.*
def enclosingClass(symb: Symbol): Symbol =
if symb.isClassDef then symb else enclosingClass(symb.owner)
val name = enclosingClass(Symbol.spliceOwner).fullName
Literal(StringConstant(name)).asExprOf[String]
推荐阅读
- php - 使用 hash_hmac() 在 PHP 中实现 TOTP 的问题
- pyspark - 使用分区键和索引的 DynamoDB 搜索
- sql - 使用组合框或下拉列表更新表列
- javascript - JavaScript - 从优化的角度来看,应该如何用不同的字符串替换字符串中的多个子字符串?
- node.js - 对 REST API 的 GET 请求使服务器崩溃
- javascript - Javascript 如何使用端口查找器
- visual-studio - IIS Express Web API 和多个项目
- python - 将 numpy 数组重塑为所需的形状
- scala - 对 Set 的原子引用 - 添加值
- python-3.x - Python pandas - 如何从列中挑选日期并将它们移动?