2012-04-17
■[.groovy] Named arguments
コンパイラさんに教えてもらった。
def aMethodHasNamedArguments(Map named=[:], Object... args) { println "named=$named, args=$args" } aMethodHasNamedArguments("A", key1:1, "B", key2:2, "C") // named=[key1:1, key2:2], args=[A, B, C] aMethodHasNamedArguments() // named=[:], args=[]
Groovy 1.8.6 の AntlrParserPlugin より
if (namedArguments) {
if (!expressionList.isEmpty()) {
// let's remove any non-MapEntryExpression instances
// such as if the last expression is a ClosureExpression
// so let's wrap the named method calls in a Map expression
List<Expression> argumentList = new ArrayList<Expression>();
for (Object next : expressionList) {
Expression expression = (Expression) next;
if (!(expression instanceof MapEntryExpression)) {
argumentList.add(expression);
}
}
if (!argumentList.isEmpty()) {
expressionList.removeAll(argumentList);
checkDuplicateNamedParams(elist, expressionList);
MapExpression mapExpression = new MapExpression(expressionList);
configureAST(mapExpression, elist);
argumentList.add(0, mapExpression);
ArgumentListExpression argumentListExpression = new ArgumentListExpression(argumentList);
configureAST(argumentListExpression, elist);
return argumentListExpression;
}
}
checkDuplicateNamedParams(elist, expressionList);
NamedArgumentListExpression namedArgumentListExpression = new NamedArgumentListExpression(expressionList);
configureAST(namedArgumentListExpression, elist);
return namedArgumentListExpression;
} else {
名前付き引数は先に処理されるようだ。
トラックバック - http://d.hatena.ne.jp/deve68/20120417/1334661376