Groovy Power Print

时间:2010-07-12 20:25:25

标签: groovy

Groovy有一个功能断言,但我想要一个电源打印。例如,

def foo = 'banna5', monkey=7, x=70
println "foo=$foo, monkey=$monkey, x/2=${x/2}"

请参阅println行中重复的foo,monkey和expression ...我想要输入的是

pprint foo, monkey, x/2

这是我期望的输出(来自println或pprintln),

foo=banna5, monkey=7, x/2=35

有没有这样做的小曲?

2 个答案:

答案 0 :(得分:0)

目前在Groovy中没有什么可以做你想要的......

问题在于打印出值时获取变量的名称。

powerrassert似乎是这样做的,通过对字节码的AST操作(参见line 947 of the class org.codehaus.groovy.classgen.AsmClassGenerator)来装饰org.codehaus.groovy.runtime.powerassert包内的几个类的assert方法。

因此,为了获得您需要的结果,必须添加类似的东西来以类似的方式操纵AST。

您可以向the project's JIRA添加新功能问题,但您永远不会知道......它可能会成为未来版本的Groovy

但就目前而言,我认为你已经坚持使用你的println,因为你已经在上面

答案 1 :(得分:0)

这可能适用于您,也可能不适合您。它很可能只适用于脚本。

def pprint(def varClosure) {
    s=varClosure()
    print("\"$s\" = " + binding.variables[s])
}

test = 15

pprint{"test"}

我使用了一个闭包,因此它将传递当前上下文(以获取绑定)。您可以通过各种方式迭代闭包 - 例如,如果您传递pprint {[“test”,“anotherVar”]},您可以使用它而不是println:

s.each() { print("\"$it\" = ${binding.variables[s]},\t") }
println ""

这将非常接近你想要的结果。

如果你想用groovy类做这件事,那么绑定哈希就不存在了。有一个属性哈希,但它只访问对象属性(并非所有可用于闭包的变量 - 换句话说,它会错过方法和参数中定义的变量)。

也许闭包有一个可用的所有属性的哈希 - 这将是完美的。我会看得更晚。

还有一个你可能喜欢的对象上的dump()方法。