用于nil类的Ruby未定义方法

时间:2015-03-30 16:28:00

标签: ruby-on-rails ruby arrays

我正在创建一个比较数组中数字的简单方法。有规则,但我不认为需要这些信息。

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])时,一切正常。

为什么订单在这里很重要?

2 个答案:

答案 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,但未评估,因为条件的第一部分失败。