节点行为错误与插值字符串

时间:2013-11-11 23:24:50

标签: groovy

当我使用插值字符串创建子节点时,我无法使用点表示法再次访问该节点。当我尝试访问相关节点时,我得到null。如果我循环遍历children()并寻找它,我可以得到节点,但我不应该这样做。以下代码重复了该问题:

// All works as expected when an interpolated string isn't used to create the child node
def rootNode = new Node(null, "root")
def childNode = new Node(rootNode, "child", [attr: "test"])
def childNodeCopy = rootNode.child[0]
println childNode.toString() // child[attributes={attr=test}; value=[]]
println childNodeCopy.toString() // child[attributes={attr=test}; value=[]]
println childNode.toString() == childNodeCopy.toString() // true

// But when an interpolated string is used the child node cannot be accessed from the root
rootNode = new Node(null, "root")
def childName = "child"
childNode = new Node(rootNode, "$childName", [attr: "test"])
childNodeCopy = rootNode.child[0]
println childNode.toString() // child[attributes={attr=test}; value=[]]
println childNodeCopy.toString() // null
println childNode.toString() == childNodeCopy.toString() // false

1 个答案:

答案 0 :(得分:1)

啊,这是因为在内部, Node必须将节点名称存储为映射中的键实际上,它只是遍历节点的名称,但是在Java中,它不会找到孩子,因为string.equals( groovyString )永远不会是真的

由于Groovy字符串不是字符串,rootNode.child正在返回null

作为解决方法,您可以执行以下操作:

childNode = new Node(rootNode, "$childName".toString(), [attr: "test"]) 
childNodeCopy = rootNode.child[0]