以下代码中的函数f
只是尝试打印出它的参数以及它接收的数量。但是,它会扩展数组参数(但不是arraylists),如行f(x) // 3
所示。无论如何都要让f
不要扩展数组参数,或者至少检测到它已经发生,并且可能是正确的。这是因为我的“真正的”f函数不是那么简单,而是将它的参数传递给给定的函数g
,它通常不是一个变量参数函数,而是直接将数组作为参数,以及f
的扩张使得这种情况更加糟糕。
def f = {
Object... args ->
print "There are: ";
print args.size();
println " arguments and they are: ";
args.each { println it };
println "DONE"
}
def x = new int[2];
x[0] = 1;
x[1] = 2;
f(1,2); // 1
f([1,2]); // 2
f(x); // 3
答案 0 :(得分:3)
我怀疑是否有任何干净的解决方案,因为它表现为Java varargs。您可以在闭包内测试数组的大小,或者像在Java中一样,使用方法重载:
public class Arraying {
public static void main(String[] args) {
// prints "2"
System.out.println( concat( new Object[] { "a", "b" } ) );
// prints "a". Commenting the second concat(), prints "1"
System.out.println( concat( "a" ) );
// prints "3"
System.out.println( concat( "a", "b", "c" ) );
}
static String concat(Object... args) {
return String.valueOf(args.length);
}
static String concat(Object obj) { return obj.toString(); }
}
如果您对concat(Object obj)
方法发表评论,则所有三种方法都会与concat(Object... args)
匹配。
答案 1 :(得分:0)
您可以使用参数的标签,如下所示:
def f = {
Object... args ->
print "There are: ";
print args.size();
println " arguments and they are: ";
args.each { println it };
println "DONE"
}
def x = new int[2];
x[0] = 1;
x[1] = 2;
f(1,2); // 1
f([1,2]); // 2
f(a:x); // <--- used label 'a', or anything else
然后输出是:
There are: 2 arguments and they are:
1
2
DONE
There are: 1 arguments and they are:
[1, 2]
DONE
There are: 1 arguments and they are:
[a:[1, 2]]
DONE