2014-10-08 28 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'")