boolean allValid = true;
for (FormEditText field: allFields) {
allValid = field.testValidity() && allValid;
}
私allValid
はtrue
すべてfield.testValidity
が真の場合にのみだと思いますが、この種のステートメントはどのように呼び出され、どのように機能しますか?
boolean allValid = true;
for (FormEditText field: allFields) {
allValid = field.testValidity() && allValid;
}
私allValid
はtrue
すべてfield.testValidity
が真の場合にのみだと思いますが、この種のステートメントはどのように呼び出され、どのように機能しますか?
のすべての結果が true である場合にのみ、変数を true に設定するのは、やや不可解で無駄の多い方法field.testValidity()
です。
より効率的であるため、次のようなものを好みます。何らかの理由でコレクション内のすべてのアイテムに対して testValidity() を呼び出す必要がある場合を除きます (その場合、関数の名前を実際に変更する必要があります)。
boolean allValid = true;
for (FormEditText field: allFields) {
if (!field.testValidity()){
allValid = false;
break;
}
}
あなたの仮定は正しいです。右側のいずれかの式が に評価されたfalse
場合、AND
( &&
) は に評価されfalse
、その結果が次の反復で使用されます。したがって、 anyfalse
は結果にfalse
なります。
false
(testValidity()
副作用がなければ)遭遇したらすぐにループから抜けることができると主張するかもしれませんが、それは実際にはこれの機能を曇らせ、パフォーマンスの向上をいくらか (おそらく無視できる程度) 犠牲にする可能性があります。ほとんどの場合、効率よりも明快さを好む
フィールドの名前が示すように、allValidは、すべてのフォーム フィールドが有効な場合にのみ true になり、それ以外の場合はループを終了すると false になります。フォーム フィールドの少なくとも 1 つが有効でない場合は false になります。
これは知的に書かれたコードであり、ブール演算に慣れていない人には不可解に見えると思います。これは、必要に応じて私も書く方法ですが、意図を説明するコメントがいくつかあります。
allFields
コードから、変数に存在するすべてのフィールドが検証に合格するかどうかを確認するために、このコードが使用されているように見えます。
この場合、フィールドの 1 つが有効でない場合break
にループできるようにコードを変更できます。
false
いずれかfield.testValidity
がfalse
理由である場合に変わりますfalse AND x = false
そのためtrue
、それらすべて + 初期値 (true
このコードにある) がtrue
ループの後にある必要があります
allValid
true
すべてのフィールドが有効な場合のみになります。
&&
動作は、引数の 1 つが の場合false
、答えはfalse.
3 つのフィールドがある場合、次のようになります。
allValid = field3Valid && (field2Valid && field1Valid);
したがって、いずれかのフィールドが無効であることが判明した場合はallValid
、false
.
フィールド 2 が無効な場合:
allValid = true && (false && true); // ---> true && (false) ----> false
@Bathshebaの答えが指摘しているように、これはどのように機能し、非効率的です。
ループでは、field.testValidity() が true を返す限り、allValid は true のままです。field.testValidity() が false を返すとすぐに、allValid は false になり、false のままになります。
これは、偽 && 真 = 偽だからです。