我有以下简单的groovy脚本,我理解在阅读here后无效。但我现在的问题是为什么这不会退出关闭。有人可以提供解释或指向讨论闭包的文档。谢谢
def inputFile = new File("input.txt")
inputFile.eachLine{ it ,i ->
if(it.contains("abcd")){
println "abcd found on line: " + i
return true
}
}
答案 0 :(得分:2)
在eachLine
中运行的基本伪代码是:
while (true) {
def line = readLineFromFile()
if (line==null) {
break
}
closure(line, count++)
}
所以除了文件的结尾之外没有其他任何东西可以停止。闭包中的return
有效,但它只从闭包返回。
有关详细信息,请参阅org.codehaus.groovy.runtime.IOGroovyMethods.eachLine
的来源。
闭包不是while
或for
等语言构造。它们只是通过上下文传递给匿名函数。如果你把它写出来,它会变得更加清晰,代码实际意味着什么(没有常规的快捷方式):inputFile.eachLine({it,i->...})
(请注意方法调用中的()(
一般来说:groovy中的each.*
并不关心你的结果。关闭中的回报只意味着提前纾困(在你的情况下,这是一个无操作)。
因此,对于一般问题,您可以break
来自封闭吗? “没有”。 Iff你的调用者以任何方式使用闭包的结果,状态,...来允许你从中断(例如[].find()
:迭代列表,直到闭包返回是,然后返回元素),你不能(你可以抛出异常)。
答案 1 :(得分:1)
Groovy的each*
方法不会退出循环,如果你确实返回了" body"。他们只是取消了这个实体的执行,然后转到下一个实体。
相反,"发现"方法如果闭包返回true,则立即返回。
你可以使用for
或while
的普通循环,或者(不推荐)让你的闭包抛出异常