1
boolean allValid = true;
for (FormEditText field: allFields) {
    allValid = field.testValidity() && allValid;
}

allValidtrueすべてfield.testValidityが真の場合にのみだと思いますが、この種のステートメントはどのように呼び出され、どのように機能しますか?

4

8 に答える 8

5

のすべての結果が true である場合にのみ、変数を true に設定するのは、やや不可解で無駄の多い方法field.testValidity()です。

より効率的であるため、次のようなものを好みます。何らかの理由でコレクション内のすべてのアイテムに対して testValidity() を呼び出す必要がある場合を除きます (その場合、関数の名前を実際に変更する必要があります)。

boolean allValid = true;
for (FormEditText field: allFields) {
    if (!field.testValidity()){
        allValid = false;
        break;
    }
}
于 2013-07-05T08:43:54.073 に答える
1

あなたの仮定は正しいです。右側のいずれかの式が に評価されたfalse場合、AND( &&) は に評価されfalse、その結果が次の反復で使用されます。したがって、 anyfalseは結果にfalseなります。

false(testValidity()副作用がなければ)遭遇したらすぐにループから抜けることができると主張するかもしれませんが、それは実際にはこれの機能を曇らせ、パフォーマンスの向上をいくらか (おそらく無視できる程度) 犠牲にする可能性があります。ほとんどの場合、効率よりも明快さを好む

于 2013-07-05T08:41:42.393 に答える
0

フィールドの名前が示すように、allValidは、すべてのフォーム フィールドが有効な場合にのみ true になり、それ以外の場合はループを終了すると false になります。フォーム フィールドの少なくとも 1 つが有効でない場合は false になります。

これは知的に書かれたコードであり、ブール演算に慣れていない人には不可解に見えると思います。これは、必要に応じて私も書く方法ですが、意図を説明するコメントがいくつかあります。

于 2013-07-05T09:10:32.597 に答える
0

allFieldsコードから、変数に存在するすべてのフィールドが検証に合格するかどうかを確認するために、このコードが使用されているように見えます。

この場合、フィールドの 1 つが有効でない場合breakにループできるようにコードを変更できます。

于 2013-07-05T08:44:02.490 に答える
0

falseいずれかfield.testValidityfalse理由である場合に変わりますfalse AND x = false

そのためtrue、それらすべて + 初期値 (trueこのコードにある) がtrueループの後にある必要があります

于 2013-07-05T08:40:57.930 に答える
0

allValidtrueすべてのフィールドが有効な場合のみになります。

&&動作は、引数の 1 つが の場合false、答えはfalse.

3 つのフィールドがある場合、次のようになります。

allValid = field3Valid && (field2Valid && field1Valid);

したがって、いずれかのフィールドが無効であることが判明した場合はallValidfalse.

フィールド 2 が無効な場合:

allValid = true && (false && true);  // ---> true && (false) ----> false

@Bathshebaの答えが指摘しているように、これはどのように機能し、非効率的です。

于 2013-07-05T08:41:44.593 に答える
0

ループでは、field.testValidity() が true を返す限り、allValid は true のままです。field.testValidity() が false を返すとすぐに、allValid は false になり、false のままになります。

これは、偽 && 真 = 偽だからです。

于 2013-07-05T08:41:58.983 に答える