闭包和函数不能在两次调用之间记录任何由其自身定义的信息。
如果需要一个闭包在两次调用期间记住一个变量,可以将闭包的定义放嵌套在一个代码块中:
def c;
try{
def a=0;
c={a=a+it;println a};
}
c(5);//输出5
c(5);//输出10
在此,a相当于一个只能被闭包c访问的私有变量。
还可以使多个闭包同时访问一个变量:
def c1,c2,c4;
try{
def a=0;
c1={a=a+it};
c2={a=a*it};
c3={a=a-it};
}
println c1(5);
println c2(2);
println c3(7);
可以将多个访问公共私有变量的闭包放入一个Map,来表示它们之间的关系:
def m=[:];
try{
def a=10;
m.x={a+it};
m.y={a-it};
}
println m.x(5);
println m.y(5);
我们可通过Expando访问私有变量。Expando允许我们将闭包赋予Expando名称。
def Expando expando=new Expando();
try{
def a=10;
expando.x={a+it};
expando.y={a-it};
}
println expando.x(5);
println expando.y(5);
还可以将变量赋予Expando名称,来代替公共的私有变量:
def Expando expando=new Expando();
expando.name="Tom";
expando.getName={name};
println expando.getName();
在Expando中的闭包可以看到所在其外层定义的变量:
def a=0;
try{
def expando=new Expando();
expando.c1={
//def a;//由于外部已经定义了变量a,此处无法编译
}
}
不管是独立的闭包或是在Expando中的闭包,我们都可以通过隐式的Map参数使所有的变量都可以访问:
def a= 7
def c;
try{
c= {
it= [it: it]
it.a= 2//在次数定义a不会与外部的a发生冲突
it.it + it.a
}
}
println c(3);
这样可以确保变量被正常的使用,而不会与范围内的其他变量发生冲突。