由于闭包的行为类似于内联方法(我猜,技术上闭包被编译为类),我没有找到如何从Groovy中的闭包返回一个方法。
例如,如果我没有使用闭包,那么从main()
调用下面的方法应该只打印1,但是使用闭包它会打印所有1,2,3:
public static returnFromClosure()
{
[1,2,3].each{
println it
if (it == 1)
return
}
}
我如何才能实现这种行为?
修改
这个问题是重复的。
我的问题是关于一般的关闭。我举了一个涉及闭包的each{}
循环的例子。我知道在break
循环中使用continue
和each{}
的问题是存在的,但这将涉及打破循环或继续循环的下一次迭代,而不是关于返回调用代码。这种误解背后的罪魁祸首似乎是我上面给出的例子。但是,在任何循环中使用return
与使用break
不同。我最好给出不同的例子。这是简单的闭包:
static main(def args)
{
def closure1 = {
println 'hello';
return; //this only returns this closure,
//not the calling function,
//I was thinking if I can make it
//to exit the program itself
println 'this wont print'
}
closure1();
println 'this will also print :('
}
答案 0 :(得分:0)
我不熟悉groovy,但这似乎是预期的行为。通常在每个语句中,它实际上运行一个函数,对于数组中的每个值单独。
所以当你第一次运行它时,它会传递if语句,然后返回。
然后下一个函数运行,这次值为2。它打印出2,该值不传递if语句,然后返回,因为它是函数的结尾。
如果您只想打印与之匹配的值,您可以这样做。
public static returnFromClosure()
{
[1,2,3].each{
if (it == 1)
println it
}
}
如果你想停止执行每个功能并在找到一个等于1的值后继续前进,你应该查看另一个帖子。 is it possible to break out of closure in groovy
根据您的更新进行修改:
我所知道的没有特定的机制就像你说的那样。闭包只是在特定上下文中编写的函数,就像任何其他函数只能从它们自己的执行中返回一样。我认为你想要的是这样的。
static main(def args){
done = false;
def closure1 = {
println 'hello';
done = true;
return; //this only returns this closure,
//not the calling function,
//I was thinking if I can make it
//to exit the program itself
println 'this wont print'
}
closure1();
if( done ){
return;
}
// this will no longer print =)
println 'this will also print :('
}