我有下面的代码和奇怪的事情,所以我 println 的东西。当我传递给匹配正则表达式的方法 String 时 - 打印:
---------->1
---------->2
这怎么可能?如何归还不同的回报?
def getInfo(String nameOfFile) {
def matcher = nameOfFile =~ /(\w+)_(\w+)_(\w+)/
if (matcher.matches()) {
matcher.each { fullName, CN, FN, PN->
println "---------->1"
return [nameOfFile, CN, FN, PN]
}
}
println "----------->2"
return [nameOfFile]
}
答案 0 :(得分:3)
这只是从Closure
返回,而不是封闭方法
return [nameOfFile, CN, FN, PN]
根据您尝试做的事情(您不提供任何示例输入),您可能需要findResult
而不是each
:
def getInfo( String nameOfFile ) {
def matcher = nameOfFile =~ /(\w+)_(\w+)_(\w+)/
if (matcher.matches()) {
matcher.findResult { fullName, CN, FN, PN->
[nameOfFile, CN, FN, PN]
}
}
else {
[nameOfFile]
}
}
答案 1 :(得分:1)
以下是Java中Groovy代码的非常粗略的近似值(使用1.6):
import java.util.*;
import java.util.regex.*;
interface ClosureBlock {
Object each(String... args);
}
public class Runner {
public List<String> getInfo(String nameOfFile) {
List<String> results = new ArrayList<String>();
Pattern regex = Pattern.compile("(\\w+)_(\\w+)_(\\w+)");
Matcher matcher = regex.matcher(nameOfFile);
if (matcher.matches()) {
String fullName = matcher.group(0);
String CN = matcher.group(1);
String FN = matcher.group(2);
String PN = matcher.group(3);
ClosureBlock closure = new ClosureBlock() {
public Object each(String... args) {
List<String> results = new ArrayList<String>();
String fullName = args[0];
String CN = args[1];
String FN = args[2];
String PN = args[3];
results.add(fullName);
results.add(CN);
results.add(FN);
results.add(PN);
// this return does not exit getInfo()
System.out.println("----------->1");
return results;
}
};
// each returns an Object but we didn't assign it
closure.each(fullName, CN, FN, PN);
}
System.out.println("----------->2");
results.add(nameOfFile);
return results;
}
public static void main(String... args) {
Runner quick = new Runner();
List<String> list = quick.getInfo(args[0]);
System.out.println(list);
}
}
关键点是:
Runner
使用每个方法定义一个匿名内部类。在each
方法中调用return不会退出getInfo
方法each
方法返回Object
,我们也不会将其分配给任何内容,以便List<String>
中的getInfo
不受影响。Java丑陋复杂。 Groovy代码更优雅,但是关于你的问题,Java代码说明了这个想法。