итерация для создания хэшей в массиве - PullRequest
1 голос
/ 24 октября 2019

поэтому я знаю, как я могу выполнить итерацию и создать массив внутри хеша

  travel=["Round Trip Ticket Price:", "Price of Accommodation:", "Number of checked bags:"]
  (1..3).each_with_object({}) do |trip, travels|
    puts "Please input the following for trip # #{trip}"
    travels["trip #{trip}"]= travel.map { |q| print q; gets.chomp.to_f }
  end 
  ==>{"trip 1"=>[100.0, 50.0, 1.0], "trip 2"=>[200.0, 100.0, 2.0], "trip 3"=>[300.0, 150.0, 
   3.0]}

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

        travels=[{trip_transportation: 100.0, trip_accommodation:50.0, trip_bags:50}
        {trip_transportation:200.0, trip_accommodation:100.0, trip_2_bags:100}
        {trip_3_transportation:300.0, trip_accommodation:150.0, trip_3_bags:150}]

Я действительно запутался, в основном единственное, что я хочу знать, как это сделать, - это как сделать три отдельных хеша при использовании цикла. Я хочу, чтобы каждый хэш представлял поездку. Это вообще возможно?

Ответы [ 2 ]

2 голосов
/ 24 октября 2019
travel=[{ prompt: "Round Trip Ticket Price: ",
          key: :trip_transportation, type: :float },
        { prompt: "Price of Accommodation : ",
          key: :trip_accommodation, type: :float },
        { prompt: "Number of checked bags : ",
          key: :trip_bags, type: :int }]

nbr_trips = 3

Предположим, что при запуске следующего кода пользователь должен был ввести значения, приведенные в примере вопроса.

(1..nbr_trips).map do |trip|
  puts "Please input the following for trip #{trip}"
  travel.map do |h|
    print h[:prompt]
    s = gets
    [h[:key], h[:type] == :float ? s.to_f : s.to_i]
  end.to_h
end
  #=> [{:trip_transportation=>100.0, :trip_accommodation=>50.0, :trip_bags=>1},
  #    {:trip_transportation=>200.0, :trip_accommodation=>100.0, :trip_bags=>2},
  #    {:trip_transportation=>300.0, :trip_accommodation=>150.0, :trip_bags=>3}] 

Я не вижу причин для ключей иметь разные имена для разных поездок (например, :trip_2_bags и trip_3_bags, а не просто trip_bags для всех поездок).

0 голосов
/ 24 октября 2019

Использование хэша для настройки, аналогично ответу Кэри Свовеланд и аналогичному моему ответу здесь: https://stackoverflow.com/a/58485997/5239030

travel = { trip_transportation: { question: 'Round Trip Ticket Price:', convert: 'to_f' },
           trip_accommodation:  { question: 'Price of Accommodation:', convert: 'to_f' },
           trip_bags: { question: 'Number of checked bags:', convert: 'to_i' } }

n = 2
res = (1..n).map do # |n| # uncomment if (*)
  travel.map.with_object({}) do |(k, v), h|
    puts v[:question]
    # k = k.to_s.split('_').insert(1, n).join('_').to_sym # uncomment if (*)
    h[k] = gets.send(v[:convert])
  end
end

res
#=> [{:trip_transportation=>10.0, :trip_accommodation=>11.0, :trip_bags=>1}, {:trip_transportation=>20.0, :trip_accommodation=>22.0, :trip_bags=>2}]


(*) Раскомментируйте, если хотите, чтобы результат выглядел следующим образом:
#=> [{:trip_1_transportation=>10.0, :trip_1_accommodation=>11.0, :trip_1_bags=>1}, {:trip_2_transportation=>20.0, :trip_2_accommodation=>22.0, :trip_2_bags=>2}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...