9

このコードに出くわしました:

n = args[0] as Long
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) }

ツリー形式の構造を印刷するために使用されます。このような:

    *
   ***
  *****
 *******
    *

( n=4 の場合)

  1. コードはどのように[*n..1,n]生成し[4, 3, 2, 1, 4]ますか?

  2. anyメソッドはここでどのように機能しますか? Docはあまり役に立ちません。渡すことができる予測は何ですか( Docanyで述べたように)?

この場合の使用any方法とその処理方法は何ですか?

4

2 に答える 2

11

Q1a:*アレイを「アンパック」します。..範囲を作成します。[]コレクションを作成します。
Q1b:*n..1[4,3,2,1]を個々のパーツに解凍します。
Q1c:[4,3,2,1,n]==[4,3,2,1,4]

anyQ2:なぜここで使用されたのかわかりません。each同様に機能し、コンテキストでより理にかなっています。接続をループするため、副作用は意図したとおりに機能しますany println

通常any、コレクション要素が基準を満たしているかどうかを判断するために使用されます。次に例を示します。

[*n..1,n].any { it > 10 } // Returns false, no elements are > 10
[*n..1,n].any { it == 3 } // Returns true, because at least one element is 3

閉鎖の最後のステートメントは、各アイテムが基準を満たしているかどうかを判断するために使用されます。printlnnullanyを返すため、falseを返します。値は未使用で破棄されます。

誰かが使用した可能性があると私が考えることができる唯一の理由は、コンソールにanyの戻り値が表示されないようにするためです。元のコレクションを返します。eacheach

于 2011-12-11T17:48:36.263 に答える
3

1)n..1範囲リテラルと呼ばれ、からにgroovy.lang.Range1ずつ減少するオブジェクトを作成します。次に、これは「スプレッド演算子(*)」を使用して周囲のリストコンテキストにマージされますn1

2)anyメソッドはで定義されてDefaultGroovyMethodsおり、コレクション内の要素が指定された述語クロージャーを満たす場合にtrueを返す述語関数です。この例では、コードは戻り値をチェックしないため、元のotherは、each代わりに呼び出しを使用して同じ出力を生成する可能性があります。

于 2011-12-11T17:47:47.043 に答える