Неопределенный метод Ruby / NoMethodError '*' для nil: NilClass, работает до цикла - PullRequest
0 голосов
/ 11 ноября 2018

Моя программа упорядочивает массивы 1 и 2 и выполняет итерацию, чтобы проверить, является ли каждый элемент в 1 sqrt каждого элемента в 2. Я проверил сравнение без цикла, и он работает нормально, поэтому я не подумайте , что есть неинициализированная переменная.

def comp(array1, array2)
  order1 = array1.sort
  order2 = array2.sort

  i = 0

  while i < order1.length
    if order1[i] * order1[i] == order2[i]
      i += 1
    else
      false
    end
  end

  order1[i] * order1[i] == order2[i]

end

Можете ли вы указать мне направление проблемы?Я также не использовал Math.sqrt, потому что в моем интерфейсе истекло время ожидания.

1 Ответ

0 голосов
/ 11 ноября 2018

Ваш i равен order1.length после вашего цикла, поэтому последняя строка вашего метода в основном

order1[order1.length] * order1[order1.length] == order2[order1.length]

что (при условии, что ваши массивы одинаковой длины):

nil * nil == nil

который выдает ошибку. Не уверен, зачем вам последняя строка, если вы удалите ее и просто вернете счетчик, ваш метод будет работать как положено, если вы используете выделенный счетчик для элементов, которые соответствуют вашему условию, вместо использования индекса для этого (ваш индекс должен увеличиваться всегда):

def comp(array1, array2)
  order1 = array1.sort
  order2 = array2.sort

  i = 0
  counter = 0

  while i < order1.length
    if order1[i] * order1[i] == order2[i]
      counter += 1
    end

    i += 1
  end

  counter
end

В Ruby довольно часто используются правильные перечислители для перебора коллекций, поэтому ваш while может быть заменен на Enumerable # each_with_index :

def comp(array1, array2)
  order1 = array1.sort
  order2 = array2.sort

  counter = 0

  order1.each_with_index do |el, i|
    if el * el == order2[i]
      counter += 1
    end
  end

  counter
end

И в качестве последнего шага мы также можем Array # count сколько элементов в массиве соответствует определенному условию без необходимости указывать локальную переменную, например:

def comp(array1, array2)
  order2 = array2.sort
  array1.sort.each_with_index.count { |el, i| el ** 2 == order2[i] }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...