Обычно в Ruby вы не будете использовать операторы loop
и break
. Модуль Enumerable сделает большую часть этого за вас. Это может занять некоторое время, чтобы привыкнуть к нему, но тогда это станет естественным и позволит вам быстро ко многим вещам. Обратите внимание, что другие языки программирования используют аналогичные понятия.
В
a = line.select {|k,v| k.to_sym == from_station} #how to implement this condition?
b = line.select {|k,v| k.to_sym == to_station}#
вы выполняете типичные поиски в Hash, что можно сделать с помощью
def sum(from_station, to_station)
from_station_colors = @lines[from_station]
to_station_colors = @lines[to_station]
if (from_station_colors.nil? || from_station_colors.empty?)
# from_station not found
end
# ...
end
Поиск в timing
немного сложнее:
require 'yaml'
timings = YAML::load_file('timing.yml')['timing']
from_station = :tokyo
to_station = :chicago
# "t" (a timing entry) might be nil, thus the first select
# Note that there are other handy functions to make this more readable
# (left as an exercise)
transit = timings.select{|t| t}.select do |timing|
# if the following line evaluates to "true", select this entry
timing['start'] == from_station && timing['end'] == to_station
end
puts transit # {"start"=>:tokyo, "end"=>:chicago, "time"=>6, "price"=>3}
Ваш другой вопрос (выясните, имеют ли места одинаковый «цвет»), вероятно, следует задавать отдельно. Почему-то эта задача звучит как домашнее задание.
И добро пожаловать в StackOverflow! Пожалуйста, постарайтесь как можно точнее ответить на ваш следующий вопрос (вопросы), сводя при этом примеры к «хорошему» минимуму.