我需要创建一个对象,而无需事先描述其结构。对象由参数组成,这些参数本身可以是对象(如json对象(。
然后我希望能够使用以下语法创建一个对象:
def a = <TBD>
a.b.c = 'd'
这将导致a = [b:[c:d]]
我认为实现这一点的一种方法是使用默认值,但我必须提前了解对象的深度。
def a = [:].withDefault { [:].withDefault { [:] } }
a.b.c = 'd'
// results in a = [b:[c:d]]
还有别的办法吗?
def M(){ [:].withDefault{ M() } }
def a=M()
a.b.c.d.e.f.g.h = '123'
println a
打印
[b:[c:[d:[e:[f:[g:[h:123]]]]]]]
提供更多控制的更复杂的方法:
class Endless {
Map<String,Endless> m = [:]
def propertyMissing(String name, value) {
m[name] = value
}
def propertyMissing(String name) {
if( !m.containsKey( name ) ) m[ name ] = new Endless()
m[name]
}
String toString(){ m }
}
Endless a = new Endless()
a.b.c.d.e = 42
assert a.toString() == '{b={c={d={e=42}}}}'
assert a.b.c.toString() == '{d={e=42}}'