Groovy:检测传递数组的时间

时间:2013-06-04 07:09:46

标签: groovy variadic-functions

以下代码中的函数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

2 个答案:

答案 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