问题
给出以下代码:
if (enforceLength && rawContents.length != recordLength) {
现在,如果enforceLength
和rawContents
与recordLength
不匹配,则返回true并触发我们的警告系统。但是,我们的某些recordLength
字符HEADER_DIFF
字符长于rawContents.length
。
因此,我们希望在or
上加rawContents.length
,以便它可以匹配recordLength
或recordLength + HEADER_DIFF
。
问题
是否有直接的方法在if语句的第二部分创建OR条件?即如果rawContents.length
不等于recordLength
,它会触发警报,但如果recordLength
恰好比预期的HEADER_DIFF
更长,则不会触发警报。
尝试失败
一次尝试失败:
if (enforceLength && rawContents.length != recordLength + HEADER_DIFF
|| rawContents.length != recordLength)
答案 0 :(得分:2)
不正常的逻辑结
if (enforceLength && rawContents.length != recordLength
&& rawContents.length != recordLength + HEADER_DIFF) {
也许否定词更容易理解
if (enforceLength && !(rawContents.length == recordLength
|| rawContents.length == recordLength + HEADER_DIFF)) {
答案 1 :(得分:2)
这是一个经典的问题,试图通过对箭头模式的非理性恐惧将一个if
语句折叠得过多。
当然这会更清楚。
if (enforceLength) {
// Can be correct or out by HEADER_DIFF
if(!(rawContents.length == recordLength + HEADER_DIFF || rawContents.length == recordLength)) {
}
}
答案 2 :(得分:1)
如果两个条件都不成立则失败:
if (enforceLength && !(rawContents.length == recordLength + HEADER_DIFF || rawContents.length == recordLength))
答案 3 :(得分:1)
如果我正确理解您的问题,您只需要在OR周围使用括号,并将其替换为AND,如下:
if (enforceLength && (rawContents.length != recordLength && rawContents.length != recordLength + HEADER_DIFF))
答案 4 :(得分:0)
您是否考虑过使用嵌套的if?
if (enforceLength)
{
if(test for header diff)
{
rawContents.length != recordLength + HEADER_DIFF
}
else
{
rawContents.length != recordLength)
}
}
理解起来更复杂但更容易理解。