在groovy中从闭包返回一个方法

时间:2015-08-07 14:06:15

标签: design-patterns groovy closures

由于闭包的行为类似于内联方法(我猜,技术上闭包被编译为类),我没有找到如何从Groovy中的闭包返回一个方法。

例如,如果我没有使用闭包,那么从main()调用下面的方法应该只打印1,但是使用闭包它会打印所有1,2,3:

public static returnFromClosure()
{
    [1,2,3].each{
        println it
        if (it == 1)
            return            
    }
}

我如何才能实现这种行为?

修改

这个问题是重复的。 我的问题是关于一般的关闭。我举了一个涉及闭包的each{}循环的例子。我知道在break循环中使用continueeach{}的问题是存在的,但这将涉及打破循环或继续循环的下一次迭代,而不是关于返回调用代码。这种误解背后的罪魁祸首似乎是我上面给出的例子。但是,在任何循环中使用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 :('
}

1 个答案:

答案 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 :('
}