0

我有一个 groovy scipt 在我的应用程序中扮演配置角色。它的结构将是这样的:

a{
     b=val1
     c{
          d=val2
     }
 }
e{
     f=val3
 }

如何迭代此配置中的实体以将一个根的设置与另一个根的设置分开?我的意思是这样的迭代方式,我将能够确定根位置,如下所示:

 a (root)
 b
 c (subroot)
 d
 e (root)
 f

并且配置级别不受 2 级限制,因此使用简单的内部“for”循环进行迭代是不合适的,因为我不知道编译会有多少级别。

4

1 回答 1

2

你的意思是这样吗?

给定一个配置:

def cfg = '''
a {
    b = 'val1'
    c {
        d = 'val2'
    }
}
e {
    f = 'val3'
}'''

您可以像这样定义递归walk方法:

def walk( map, root=true ) {
    map.each { key, value ->
        if( value instanceof Map ) {
            println "$key (${root?'root':'subroot'})"
            walk( value, false )
        }
        else {
            println "$key"
        }
    }
}

然后调用该函数,传入 slurped 配置:

walk( new ConfigSlurper().parse( cfg ) )

这打印:

a (root)
b
c (subroot)
d
e (root)
f

您还可以将配置保存在文件中(在此示例中,Config.groovy

然后,您可以将walk调用更改为:

walk( new ConfigSlurper().parse( Config ) )

它会输出相同的

于 2013-10-02T12:33:59.610 回答