Почему не выполняется очевидное условие? - PullRequest
1 голос
/ 19 апреля 2019

Я работаю над заданием о расписании и у меня есть класс и файл .yml, где я хочу получить данные в виде «начальной» точки, «конечной» точки, «цены» и т. Д. И в моем классе у меня есть метод, в котором я хочу определить, соответствуют ли станции выбору пользователя:

class Train 
  require 'yaml'

  def initialize(time)
    @time = YAML.load_file(time)
  end

  def calc(begin:, end:)
    ary = @time['time']
    start = begin
    stop = end
    res = []
    loop do
      tmp = ary.find { |h| h['begin'] == start }
      break unless tmp
      res << tmp
      start = tmp['end']
      break if start == stop
    end
  end
end

Но это всегда дает сбой при условии

break unless tmp

Например, если записать переменную экземпляра

a = Train.new("my_path_to yml") 
a.calc(begin: ':washington', end: ':tokyo')

Это ничего не выполняет. Даже если я произвожу рефакторинг блока цикла и напишу «для» итератора, он выдаст условие «еще»:

for i in ary
  if i['begin'] == 'washington'
    puts "good"
  else
    puts "no way"
  end
end

Вот мой файл .yml

time:
  -
    begin: :washington
    end: :briston
    time: 6
    price: 3
  -
    begin: :briston
    end: :dallas
    time: 4
    price: 2
  -
    begin: :dallas
    end: :tokyo
    time: 3.5
    price: 3
  -
    begin: :tokyo
    end: :chicago
    time: 3.5
    price: 3
  -
    begin: :chicago
    end: :dellawer
    time: 3.5
    price: 3

Заранее спасибо!

1 Ответ

4 голосов
/ 19 апреля 2019

Попробуйте это изменение, проверьте комментарии в коде:

def calc(begin_:, end_:) # <-- don't call variables begin or end, they are reserved words
  ary = @time['time']
  start = begin_
  stop = end_
  res = []
  loop do
    tmp = ary.find { |h| h['begin'] == start }
    break unless tmp
    res << tmp
    start = tmp['end']
    break if start == stop
  end
  res # <-- return something
end

Звоните как:

train.calc(begin_: :washington, end_: :tokyo)
#=> [{"begin"=>:washington, "end"=>:briston, "time"=>6, "price"=>3}, {"begin"=>:briston, "end"=>:dallas, "time"=>4, "price"=>2}, {"begin"=>:dallas, "end"=>:tokyo, "time"=>3.5, "price"=>3}]


Будьте осторожны, чтобы не перепутать строки с символами.
  ary.each do |i| # for i in ary <-- pythonic! :)
    if i['begin'] == :washington # <-- should be a symbol to pass, not a string
      puts "good"
    else
      puts "no way"
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...