интерполировать строку с возрастающим числом - PullRequest
2 голосов
/ 05 апреля 2019

Я пытаюсь интерполировать строку с номером и увеличивать это число, пока я повторяю список участников ... Строка "Hello #{name}. You are guest number #{num}." Я знаю, как перебирать каждое имя гостя, но как мне получить число, которое будет увеличиваться в строке от 1..7? Я знаю, что это просто. Я очень новичок.

Перепробовал все.

def assign_rooms(attendees)
  room_assignments = []
  rooms.to_s = [1, 2, 3, 4, 5, 6, 7]
  attendees.each_with_index {|x| room_assignments<< "Hello #{x}! You'll be assigned room #{rooms}!"}
  room_assignments
end

Ответы [ 3 ]

1 голос
/ 05 апреля 2019

Enumerable#each_with_index дает блоку два аргумента: сам элемент (участник) и индекс элемента, который увеличивается по желанию.Вы также можете комбинировать с Array#map, чтобы избежать необходимости явно создавать и добавлять вывод во второй массив.Enumerator#with_index позволяет указать начальное смещение для индекса (чтобы номера комнат не начинались с нуля).

def assign_rooms(attendees)
  attendees.map.with_index(1) {|attendee, room|
    "Hello #{attendee}! You'll be assigned room #{room}!"
  }
end

puts assign_rooms(['Alice', 'Bob', 'Jack'])

Выходы:

Hello Alice! You'll be assigned room 1!
Hello Bob! You'll be assigned room 2!
Hello Jack! You'll be assigned room 3!
0 голосов
/ 05 апреля 2019

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

Давайте использовать эти входные данные:

rooms = [110, 111, 112, 210, 211, 212].map { |n| [n, {free: true, host: nil}] }.to_h
reception_queue  = %w|Kirk Picard Spock McCoy Riker LaForge|

Допустим, одна комната уже забронирована:

rooms[210] = {free: false, host: 'Uhura'}
rooms #=> {110=>{:free=>true, :host=>nil}, 111=>{:free=>true, :host=>nil}, 112=>{:free=>true, :host=>nil}, 210=>{:free=>false, :host=>"Uhura"}, 211=>{:free=>true, :host=>nil}, 212=>{:free=>true, :host=>nil}}

Теперь мы хотим назначить свободные комнаты каждому посетителю. Требуется найти первую доступную комнату, соответствующую какому-либо условию (бесплатно, но может быть одна кровать, две кровати, люкс и т.д., в зависимости от сложности модели).

Этого можно достичь с помощью Enumerable # find :

rooms.find { |_, v| v[:free] }
#=> [110, {:free=>true, :host=>nil}]

Как только мы найдем комнату, мы хотим назначить там хост, удалив ее из очереди ( Array # shift ). Прерывание цикла, если совпадения нет.


Например:
reception_queue.size.times do |person|
  nr = rooms.find { |_,v| v[:free] }
  break unless nr
  rooms[nr[0]][:host] = reception_queue.shift
  rooms[nr[0]][:free] = false
end

Таким образом, вы можете получить:

rooms #=> {110=>{:free=>false, :host=>"Kirk"}, 111=>{:free=>false, :host=>"Picard"}, 112=>{:free=>false, :host=>"Spock"}, 210=>{:free=>false, :host=>"Uhura"}, 211=>{:free=>false, :host=>"McCoy"}, 212=>{:free=>false, :host=>"Riker"}}
reception_queue #=> ["LaForge"]
0 голосов
/ 05 апреля 2019

Вы также можете достичь своей цели с помощью счетчика.Предположим, что номер первой комнаты 2.

attendees = %w| Flora Billy-Bob Hank Trixie Herb |
  #=> ["Flora", "Billy-Bob", "Hank", "Trixie", "Herb"] 

nbr = 2.step
  #=> (2.step)

nbr.is_a?(Enumerator)
  #=> true

attendees.each { |name|
  puts "Hello, #{name}, you've been assigned to our best room, number #{nbr.next}!" }
Hello, Flora, you've been assigned to our best room, number 2!
Hello, Billy-Bob, you've been assigned to our best room, number 3!
Hello, Hank, you've been assigned to our best room, number 4!
Hello, Trixie, you've been assigned to our best room, number 5!
Hello, Herb, you've been assigned to our best room, number 6!

Обратите внимание на следующее.

nbr.next #=> 7 
nbr.next #=> 8 
nbr.rewind
nbr.next #=> 2 

См. Числовой # шаг , Перечислитель # следующий и (только если вам интересно) Перечислитель # перемотка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...