#ruby #arrays
#ruby #массивы
Вопрос:
Я создал следующий код как часть упражнения в руководстве по Ruby, которое я пытаюсь:
title = ['Chapter 1: Numbers','Chapter 2: Letters','Chapter 3: Variables']
pages = ['Page 1','page 72','page 118']
linewidth = 40
header = '*Table of Contents*'
puts header.center linewidth
puts
puts ((title[0]).ljust linewidth/2) ((pages[0]).rjust linewidth/2)
puts ((title[1]).ljust linewidth/2) ((pages[1]).rjust linewidth/2)
puts ((title[2]).ljust linewidth/2) ((pages[2]).rjust linewidth/2)
Мой вопрос в том, можно ли вышесказанное выполнить, не уточняя, какую часть массива отображать? т. Е. могу ли я просто одним битом кода заставить его перечислять все заголовки и все страницы в массиве по порядку? Если да, то как это можно было бы сделать?
Ответ №1:
Вы можете вывести список следующим образом:
titles.each_with_index do |title,index|
puts title.ljust(linewidth/2) (b[index] ? b[index].rjust(linewidth/2) : nil)
end
Ответ №2:
Как насчет:
>> title = ['Chapter 1: Numbers','Chapter 2: Letters','Chapter 3: Variables']
#=> ["Chapter 1: Numbers", "Chapter 2: Letters", "Chapter 3: Variables"]
>> pages = ['Page 1','page 72','page 118']
#=> ["Page 1", "page 72", "page 118"]
>>
.. linewidth = 40 #=> 40
>> header = '*Table of Contents*'
#=> "*Table of Contents*"
>> center = linewidth / 2
#=> 20
>> puts header.center linewidth #=> nil
*Table of Contents*
>> puts
#=> nil
>> title.zip(pages) do |t, p|
.. puts "#{t.ljust(center)} #{p.ljust(center)}"
.. end
Chapter 1: Numbers Page 1
Chapter 2: Letters page 72
Chapter 3: Variables page 118
#=> nil
Ответ №3:
titles
и pages
являются параллельными массивами. Array.zip
отлично справляется с параллельными массивами:
title.zip(pages).each do |title, pages|
puts (title.ljust linewidth / 2) (pages.rjust linewidth / 2)
end
Комментарии:
1. Ах, большое спасибо. Параллельные массивы и ‘.zip’ — это не то, что до сих пор рассматривалось в моем руководстве, но выглядит как гораздо лучшее решение.