【问题标题】:Groovy Power PrintGroovy 电源打印
【发布时间】:2011-03-15 00:04:35
【问题描述】:

Groovy 有一个 power assert,但我想要一个 power print。例如,

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

在 println 行中查看重复的 foo、monkey 和表达式...我要输入的是这个,

pprint foo, monkey, x/2

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

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

已经有这样的小曲了吗?

【问题讨论】:

  • 为什么是的,我确实使用 println 进行调试。你怎么知道的?
  • 我真正想要的是 [Bret Victor 谈论 Inventing on Principle。] vimeo.com/36579366 用于 groovy。本质上是透明度和即时反馈。

标签: groovy


【解决方案1】:

目前在 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 就像上面那样卡住了

【讨论】:

    【解决方案2】:

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

    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() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多