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
为真时,但这种陈述是如何被调用的或者它是如何工作的?
当且仅当 的所有结果都为真时,将变量设置为真是一种相当神秘且浪费的方式field.testValidity()
。
我更喜欢以下内容,因为它更有效;除非由于某种原因需要在集合中的每个项目上调用 testValidity() (在这种情况下,该函数确实应该重命名):
boolean allValid = true;
for (FormEditText field: allFields) {
if (!field.testValidity()){
allValid = false;
break;
}
}
你的假设是正确的。如果右侧的任一表达式的计算结果为false
,则AND
( &&
) 的计算false
结果为 ,并且该结果将用于下一次迭代。因此任何false
都会导致false
结果。
您可能会争辩说,您可以在遇到 a 时立即跳出循环false
(前提testValidity()
是没有副作用),但这实际上可能会以牺牲一些(也许可以忽略不计的)性能提升为代价而使这个循环的功能变得模糊。在大多数情况下,我更喜欢清晰而不是效率
false
如果有任何field.testValidity
原因false
,它会转向false AND x = false
所以它必须是true
所有它们+初始值(true
在这段代码中)true
在循环之后
allValid
仅true
当所有字段都有效时。
&&
行为是这样的,如果其中一个论点是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。
这是因为 false && true = false。
从代码来看,该代码似乎用于检查allFields
变量中存在的所有字段是否都通过了验证。
在这种情况下,我们可以修改代码,如果其中一个字段无效,那么我们可以break
循环。
for (FormEditText field: allFields)
表示 foreach field
in allFields
check field.testValidity() AND allValid
。因此,如果在任何支票中field.testValidity()
返回false
,那么allValid
将是false
.
正如该字段的名称所暗示的那样,当且仅当所有表单字段都有效时,allValid才会为真,否则在退出循环时它将为假。如果至少有一个表单字段无效,它将是错误的。
我认为这是智能编写的代码,对于那些不习惯布尔算术的人来说,这会显得晦涩难懂。如果我必须这样做,我也会这样写,但会附上一些解释意图的评论。