2014-10-08 73 views
0

考虑这一点,执行中的eval()的toString() - Groovy的(在GString的方法调用)

$RespNode 

RespJson.seatbid[0].bid[0].price 

我试图运行

Eval.me('RespJson', RespJson, "assert $RespNode.toString() == '$aValue'") 

但出错

当我运行这个(直接,如果没有的eval())

assert RespJson.seatbid[0].bid[0].price.toString()==aValue 

运行良好(无差错)

以下也能正常工作(不包括的toString())

Eval.me('RespJson', RespJson, "assert $RespNode == '$aValue'") 

任何想法,如何运行toString()与​​谢谢!

回答

1

在GString的一个方法调用需要花括号,否则父母没有得到解析为调用的一部分:

class Foo { 
    def getBar() { 'get bar' } 
    def bar() { 'method bar' } 
} 

foo = new Foo() 

assert "$foo.bar()".toString() == "get bar()" 
assert "${foo.bar()}".toString() == "method bar" 
+0

谢谢。大括号它工作正常。 'Eval.me('RespJson',RespJson,“assert $ {RespNode} .toString()=='$ aValue'”)'。但是,我们如何知道我们必须使用Gstring'$ {RespNode}'而不是'$ RespNode'? – user1207289 2014-10-08 16:48:24

+1

@ user1207289'$ RespNode' ist非常好!除非你进一步深入了解某些事情,那可以进行评估。例如'“这是$的时间点”'没关系。但''你好$世界。我的名字是X“'最有可能不是。最好使用'$ {}'来保证安全。 – cfrick 2014-10-08 16:50:28

+0

@cfrick谢谢! – user1207289 2014-10-08 16:57:28

2

$RespNode.toString()将立即被替换。你必须使用${RespNode}.toString()让它通过eval运行。否则看到@ WillP的回答(respNode.toString一次评估和toString是无属性)

def respJson = [seatbid:[[bid:[[price:666.0G]]]]] 
def respNode = 'respJson.seatbid[0].bid[0].price' 
def aValue = '666.0' 
Eval.me('respJson', respJson, "assert ${respNode}.toString() == '$aValue'")