使用 && 运算符的两种方法之间的区别

difference between two methods use of the && operator

谁能解释一下下面两种方法有什么区别?

我想我可能误解了 && 运算符的用法,因为唯一的语法差异是运算符两边的参数。我认为哪个在哪一边应该无关紧要?我是不是忽略了什么?

以下是两种方法:

def nearest_larger(arr, i)
k = 1 

  loop do
    left = i - k
    right = i + k
      if (arr[i] < arr[left]) && (left >= 0)
        j = left
        return j
      elsif (arr[i] < arr[right]) && (right < arr.length)
        j = right
        return j
      elsif (right >= arr.length) && (left < 0)
        return nil
      end

  k += 1
  end

end


def nearest_larger(arr, i)
k = 1 

  loop do
    left = i - k
    right = i + k
      if (left >= 0) && (arr[i] < arr[left])
        j = left
        return j
      elsif (right < arr.length) && (arr[i] < arr[right])
        j = right
        return j
      elsif (right >= arr.length) && (left < 0)
        return nil
      end

  k += 1
  end

end

底部的测试通过了,而顶部的却给我这个错误:

Failure/Error: nearest_larger( [2, 6, 4, 8], 3).should == nil
ArgumentError:
  comparison of Fixnum with nil failed

&& 运算符的右侧仅在左侧为真时才进行计算,否则会浪费时间,因为如果左侧为假,您已经知道整个语句为假。

在底部,导致错误的代码 (arr[i] < arr[right]) 永远不会被评估为导致错误,因为 (right < arr.length) 为假。