0

次のコードの関数fは、引数と受け取った引数の出力を試みているだけです。ただし、行に示されているように、配列パラメーター (配列リストではなく) を展開しますf(x) // 3。とにかく、f配列パラメーターを展開しないようにするか、少なくともそれが発生したことを検出し、おそらくそれを修正することはありますか? この理由は、私の「本当の」 f 関数はそれほど自明ではなく、代わりにそのパラメーターを特定の function に渡すためです。これは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 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)、3 つのメソッドすべてがconcat(Object... args).

于 2013-06-04T12:26:28.643 に答える