boolean allValid = true;
for (FormEditText field: allFields) {
allValid = field.testValidity() && allValid;
}
我认为只有allValid
每个true
都是field.testValidity
才是{{1}},但这种陈述是如何调用的,或者它是如何工作的?
答案 0 :(得分:5)
如果且仅当field.testValidity()
的所有结果都为真时,这是一种将变量设置为true的相当神秘和浪费的方法。
我更喜欢以下内容,因为它效率更高;除非由于某种原因需要在集合中的每个项目上调用testValidity()(在这种情况下,函数确实应该重命名):
boolean allValid = true;
for (FormEditText field: allFields) {
if (!field.testValidity()){
allValid = false;
break;
}
}
答案 1 :(得分:1)
你的假设是正确的。如果右侧的任一表达式评估为false
,则AND
(&&
)评估为false
,并且该结果将用于 next 迭代。因此,任何false
都会产生false
结果。
你可能会争辩说,一旦遇到false
(提供testValidity()
没有副作用),你就可以突破循环,但实际上可能会以牺牲一些(可能是微不足道的)性能提升。在大多数情况下,我希望明确效率
答案 2 :(得分:0)
如果false
为field.testValidity
false
false AND x = false
true
所以它们必须为true
所有+初始值(此代码中为true
)在循环后为{{1}}
答案 3 :(得分:0)
allValid
将只有true
。
&&
行为是这样的,如果其中一个参数是false
,答案将为false.
如果您有3个字段,那么正在发生的是:
allValid = field3Valid && (field2Valid && field1Valid);
因此,如果任何字段无效,则allValid
将为false
。
如果字段2无效,则:
allValid = true && (false && true); // ---> true && (false) ----> false
这是它的工作原理,并且如@Bathsheba的回答所指出的那样效率低下。
答案 4 :(得分:0)
在循环中,只要field.testValidity()返回true,allValid将保持为true。 只要field.testValidity()返回false,allValid就会变为false并保持为false。
这是因为假&& true = false。
答案 5 :(得分:0)
从代码中可以看出,此代码用于检查allFields
变量中的所有字段是否都通过了验证。
在这种情况下,我们可以修改代码,以便如果其中一个字段无效,那么我们可以break
循环。
答案 6 :(得分:0)
for (FormEditText field: allFields)
表示field
allFields
中的field.testValidity() AND allValid
预告field.testValidity()
。因此,如果在任何检查中false
返回allValid
,则false
将为{{1}}。
答案 7 :(得分:0)
正如字段名称所示,当且仅当所有表单字段都有效时, allValid 才为真,否则当它退出循环时将为false。如果表单字段中的至少一个无效,则为false。
我认为这是一个智能编写的代码,对那些不习惯布尔算术的人来说会显得神秘莫测。如果我不得不用一些解释意图的评论,我也会这样写。