3

我有一个列表def vrs=["6.0","6.1","6.1.0"](版本),我在一个函数中得到了一个带有这个值的地图def test=[version:6.1 HotFix11]

如何检查test'version值是否与列表匹配vrs

我试过这个vrs.each{ver-> println test.version.contains(ver)},但它给了Exception in thread "main" java.lang.StackOverflowError

更新

事实证明,我的代码有问题。我在一个小的 Groovy 脚本中尝试了测试用例,它可以工作。

这是完整的代码:

private Map params
private def root

private def nineBelow

XmlHandler(String xml)
{
    nineBelow=["6.0","6.1","6.1.0"]

    params=[:]
    root=new XmlParser().parseText(xml)
}
def getParams()
{
    if(root.product.version.size()>0)
    {
        params.version=root.product.version.text()
    }

    /*nineBelow.each {
        println params.version  //even this throws java.lang.StackOverflowError
        //println "$it , ${params.version}"
        //println ver.getClass()+", "+params.version.getClass()
         }*/

    println nineBelow.each{ver-> println params.version.contains(ver)}

    /*I need to check whether `params.version` matches with `nineBelow` list, so i'll check for condition here*/

    params
}

另一个调用的类getParams()

static main(args) {

    String fileContents = new File('E://Projects/agent6.1.xml').text
    XmlHandler xm=new XmlHandler(fileContents)  

    def params=xm.getParams()
    println params
}

更新

甚至println nineBelow.each { println params.version}给我Exception in thread "main" java.lang.StackOverflowError

更多更新

它仅在以下代码之后才起作用

def ver=params.version
    println nineBelow.each { println ver.contains(it) }

这里有什么问题?

4

2 回答 2

3

您是否有一个因某些示例 xml 失败的示例?我问是因为这(你在问题顶部说的崩溃)实际上有效:

def vrs=["6.0","6.1","6.1.0"]
def test=[ version:'6.1 HotFix11' ]

vrs.each { ver-> println test.version.contains( ver ) }

并打印:

false
true
false

但是我找不到您的其他代码有问题,因为我不知道'E://Projects/agent6.1.xml'包含什么...

于 2012-04-27T08:09:14.303 回答
1

我猜你的代码如下:

class XmlHandler {
    private Map params
    private def root

    private def nineBelow

    XmlHandler(String xml)
    {
        nineBelow=["6.0","6.1","6.1.0"]

        params=[:]
        root=new XmlParser().parseText(xml)
    }

    def getParams()
    {
        if(root.product.version.size()>0)
        {
            params.version=root.product.version.text()
        }

        nineBelow.each {
            println params.version  //even this throws java.lang.StackOverflowError
           //println "$it , ${params.version}"
           //println ver.getClass()+", "+params.version.getClass()
        }
   }
}

def doc = """
    <root>
        <product>
            <version>1.0</version>
        <version>2.0</version>
        <version>3.0</version>
        <version>4.0</version>
        <version>5.0</version>
    </product>
</root>
"""

XmlHandler handler = new XmlHandler(doc)
handler.getParams()

因此,println params.version你实际上是在调用getParams().version,从而进入一个无休止的递归调用。

在字段之前检查Groovy@symbol。正如tim_yates所说,¿bug 还是功能?

于 2012-04-27T08:23:12.400 回答