【发布时间】:2012-09-22 05:21:16
【问题描述】:
我是 Groovy 的新手。我想实现这个:
def a = { assert 1 == 1 }
def method(def a)
{
println a
}
method(a)
println 现在打印 ConsoleScript1$_run_closure1@72e9108f。但我希望它能打印assert 1 == 1。那可能吗?
【问题讨论】:
标签: groovy
我是 Groovy 的新手。我想实现这个:
def a = { assert 1 == 1 }
def method(def a)
{
println a
}
method(a)
println 现在打印 ConsoleScript1$_run_closure1@72e9108f。但我希望它能打印assert 1 == 1。那可能吗?
【问题讨论】:
标签: groovy
使用answer I linked to as a duplicate of this,如果你保存:
import groovy.inspect.swingui.AstNodeToScriptVisitor
def a = { assert 1 == 1 }
def method( def a ) {
new StringWriter().with { writer ->
a.metaClass.classNode.getDeclaredMethods("doCall")[0].code.visit new AstNodeToScriptVisitor( writer )
println "{\n$writer}"
}
}
method( a )
到文件test.groovy 然后执行:
groovy test.groovy
你得到输出:
{
assert 1 == 1 : null
return null
}
我认为这与您将要得到的一样接近...不使用code 变量(这是Groovy Statement class)中的位置数据来获取行/列号并将文件解析为文本来提取它...
【讨论】:
replaceAll 方法:"{$writer}".replaceAll(/ (null)|(return)|\n|:|/,"") 我得到更清晰的输出:{assert 'someting' == 2 }
method。当我尝试调用method(closure) 时,我收到此错误:Cannot invoke method getDeclaredMethods() on null object。哪里出了问题?
classNode,所以返回null。可能有办法解决这个问题,但重新考虑您的要求可能更容易。为什么需要这个功能?
Eval.me 之类的东西评估字符串(并运行它)?然后你有一个闭包,以及它的字符串......
您正在寻找类似 Javascript 的功能,其中在函数上调用 toString() 会打印其源代码。
Groovy 被编译为 JVM 字节码。 groovy 编译器不会在编译后的 JVM 类文件中保留源代码。
【讨论】:
在 Odersky & Co. 的《Programming in Scala》一书中有一个用 Scala 编写的著名示例。
基本上,你必须:
在Groovy SDK 中,有一个Groovy 方法directory.eachFileMatch 可以让您找到正确的文件,还有一个File.filterLine() 方法可以让您抓取正确的行。
【讨论】: