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 {
名前付き引数は先に処理されるようだ。