Почему эта локальная переменная помечена как неопределенная?- Рубин - PullRequest
0 голосов
/ 10 февраля 2011

У меня есть функция, которая проходит через массив объектов и создает новый массив объектов на основе определенных атрибутов из исходного массива. Когда я запускаю этот код, я получаю ошибку

in 'nonstop': неопределенная локальная переменная или метод `sort_list 'для main: Object (NameError)

Я убедился, что массив sort_list был инициализирован вне цикла, и я тоже пытался инициализировать его с определенным размером, но я продолжаю получать эту ошибку Я довольно новичок в ruby, так что я делаю неправильно?

    def nonstop(flight_list)
      index = 0
      sort_list[] = nil
      flight_list.each do |curr|
        if (curr.depapt == ARGV[2] && curr.arrapt == ARGV[3])
          sort_list[index] = curr
          index += 1
        end
      end
      sort_list.sort! { |a,b|  a.deptime <=> b.deptime}
      sort_list.each do |curr|
         puts "#{curr.flightnum}\t#{curr.deptime}\t#{curr.arrtime}"
      end
      if (sort_list.empty?)
        puts "none"
      end
    end

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

Я думаю, вам нужно инициализировать его так:

sort_list = []

Это не выдает ошибку в irb для меня.

2 голосов
/ 10 февраля 2011

Вот почему sort_list[] = nil не работает в ruby:

[] Сам по себе ярлык для Array.new

[] после того, как имя переменной вызывает [] для переменной. Таким образом, в этом контексте [] является методом.

sort_list ничего не установлен, поэтому он не определен. Так sort_list[] вызывает [] с неопределенным значением

Установка любой переменной равной nil делает ее равной нулю.

2 голосов
/ 10 февраля 2011

У вас уже есть правильный ответ.
Я сделаю небольшой рефакторинг, который может пригодиться новичку.

def nonstop(flight_list)
  sort_list = flight_list.select { |curr| curr.depapt == ARGV[2] && curr.arrapt == ARGV[3] }
  sort_list.sort_by! &:deptime
  sort_list.each do |curr|
    puts "#{curr.flightnum}\t#{curr.deptime}\t#{curr.arrtime}"
  end
  puts "none" if sort_list.empty?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...