Groovy学习笔记之关于闭包的一些补充

 闭包和函数不能在两次调用之间记录任何由其自身定义的信息。
如果需要一个闭包在两次调用期间记住一个变量,可以将闭包的定义放嵌套在一个代码块中:

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);

这样可以确保变量被正常的使用,而不会与范围内的其他变量发生冲突。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值