0

以下代码中的函数f只是尝试打印出它的参数以及它接收到的参数数量。但是,它会扩展数组参数(但不是数组列表),如行中所示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
4

2 回答 2

3

我怀疑是否有任何干净的解决方案,因为它的行为类似于 Java 可变参数。您可以在闭包内测试数组的大小,或者像在 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).

于 2013-06-04T12:26:28.643 回答
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
于 2013-06-04T16:00:26.877 回答