加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 用于在运行时访问函数源代码的宏

发布时间:2020-12-16 18:12:49 所属栏目:安全 来源:网络整理
导读:使用 Scala宏我想访问函数f的源代码. 这是我的问题的简化示例: def logFImplementation(f: = Boolean) { val sourceCodeOfF: String = ... // -- how to get source code of f?? println("Scala source of f=" + sourceCodeOfF)} 因此对于: logFImplementa
使用 Scala宏我想访问函数f的源代码.

这是我的问题的简化示例:

def logFImplementation(f: => Boolean) {
    val sourceCodeOfF: String = ... // <-- how to get source code of f??

    println("Scala source of f=" + sourceCodeOfF)
}

因此对于:

logFImplementation { val i = 5; List(1,2,3); true }

它应该打印:

Scala source of f=val i: Int = 5; immutable.this.List.apply[Int](1,3); true

(现在我测试了Macro to access source code text at runtime,它适用于{val i = 5; List(1,3); true} .logValueImpl但是对于f.logValueImpl它只打印f.)

谢谢你的建议.

解决方法

我严重怀疑这是可能的.

首先,宏是编译时的事情.他们所做的只是转换程序所包含的抽象语法树.这正是你能够做{val i = 5;清单(1,3); true} .logValueImpl:AST就在这里,因此将其打印为字符串没有任何困难.但是宏无法解析运行时值,因为运行时没有宏.

其次,绝对没有理由相信f是Scala代码.我可以像这样从Java调用你的函数(不确定我的名字是否正确,但是这个想法仍然是相同的):

someObject.logFImplementation(new scala.Function0<Boolean>() {
    @Override
    public Boolean apply() {
        // do some things in Java
    }
});

(这是可能的,因为内部按名称调用参数转换为scala.Function0对象).在这种情况下,您希望您的功能打印什么?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读