2

eachリストの要素を変更しないため、このテストは失敗します。

void test_each_DoesNotModifyListElements() {
    List<String> list = ["a", "b", "c"]
    list.each { it =  it + "z" }
    assert ["az", "bz", "cz"] == list
}

collect要素が変更された新しいリストが返されるため、このテストは成功します。

void test_collect_ReturnsNewListWithModifiedElements() {
    List<String> list = ["a", "b", "c"]
    list = list.collect{ it + "z" }
    assert ["az", "bz", "cz"] == list
}

予測

この時点で、私はeachリストの要素を変更しないと仮定しています。なぜなら、私は以下のテストを書いており、それがテストが私に伝えていることだと仮定しているためです。間違っている場合は修正してください。

void test_each_DoesNotModifyListElements1() {
    List<String> list = ["a", "b", "c"]
    list.each { it + "z" }
    assert ["az", "bz", "cz"] == list
}

void test_each_DoesNotModifyListElements2() {
    List<String> list = ["a", "b", "c"]
    list.each { it =  it + "z" }
    assert ["az", "bz", "cz"] == list
}

void test_each_DoesNotModifyListElements3() {
    List<String> list = ["a", "b", "c"]
    list = list.each { it =  it + "z" }
    assert ["az", "bz", "cz"] == list
}

質問

問題は、Groovy の初心者として、リストの要素が変更されないことを、テストを作成してグーグルで検索する前に、どのように事前に知っておく必要があるかということです。each

ドキュメントを読んで?

Groovy each documentation : 集約型またはデータ構造を反復処理し、各項目を指定されたクロージャーに渡します。カスタム型は、「iterator()」メソッドを提供するだけでこのメソッドを利用できます。結果のイテレータから返されたアイテムは、クロージャに渡されます。

多くの場合、私は物事を試したり、答えを探したりするのに多くの時間を費やしてしまいます. もっと効率的な方法はないのでしょうか。ある?

4

2 に答える 2

5

まあ、それは Java/Groovy プログラミングの基本からそれほど遠くありません。オブジェクトがあり、変数があります。変数は、参照と呼ばれるオブジェクトへの「リンク」を保持できます。基本的に、変数を使用すると、コンピュータ メモリの奥深くに格納されている実際のオブジェクトにアクセスできます。

変数を変更する (つまり、それに何かを割り当てる) ときはいつでも、実際のオブジェクトを変更することはありません。代わりに、変数は別のオブジェクトを指し始めます。

ここで、ドキュメントをもう一度見てみましょう。

集約型またはデータ構造を反復処理し、各項目を指定されたクロージャーに渡します。

それだけです。各項目を指す変数を提供します。与えられたローカル変数を上書きすると、変数は他のオブジェクトを指し始め、それだけです。リストにはまだ古いオブジェクトへの参照があります。

その情報は、Java や同様の言語でプログラミングするために必要な最も基本的な知識です。通常、マニュアル/ドキュメントの最初のページで説明されています。そして、それはその基本的なものであるため、何らかのパラメーターを持つ関数ごとに何度も何度も説明する必要はありません。

于 2013-05-08T10:36:26.383 に答える