我正在创建一个比较数组中数字的简单方法。有规则,但我不认为需要这些信息。
def nearest_larger(arr, idx)
diff = 1
p arr.length
while true
left = idx - diff
right = idx + diff
if (left >= 0) && (arr[left] > arr[idx])
return left
elsif (arr[right] > arr[idx]) && (right < arr.length)
return right
elsif (left < 0) && (right >= arr.length)
return nil
end
diff += 1
end
end
puts(nearest_larger([2,1,1,1], 0))
所以当我将(arr[right] > arr[idx]) && (right < arr.length)
更改为(right < arr.length) && (arr[right] > arr[idx])
时,一切正常。
为什么订单在这里很重要?
答案 0 :(得分:2)
顺序很重要,因为在&&
条件语句中,Ruby首先评估左侧。如果左侧评估为false
,则它甚至无需检查右侧,因为它已经知道整个条件为false
。
因此,对于(arr[right] > arr[idx]) && (right < arr.length)
,它首先评估:
(arr[right] > arr[idx])
这会引发错误,因为您遇到nil
值,并且>
没有nil
方法。
但是,对于(right < arr.length) && (arr[right] > arr[idx])
,它首先评估:
(right < arr.length)
一旦返回false
,它就会停止并调用整个条件false
,并且不会评估第二部分;所以没有错误。
答案 1 :(得分:1)
因为这是一种短路状况。
(arr[right] > arr[idx])
仍然评估为undefined method for nil class
,但未评估,因为条件的第一部分失败。