Рубин. Совместите вывод с правым и левым одновременно - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть этот хэш

itemHash = {"124"=>["shoes", "59.99"],
            "456"=>["pants", "49.50"], 
            "352"=>["socks", "3.99"]}

Мне нужно воспроизвести его так, чтобы Описание выровнялось по левому краю, а цена - по правому

Item    Description     Price
-----   --------------  -----
124     shoes           59.99
352     socks            3.99
456     pants           19.50

но когда я попробую этот код

itemHash.each do |a,b|
  print " #{a}     "
  b.each do |c,d|
    print ("%8s %5s" % [c,d])
  end
  puts
end

Я понял

 Item    Description      Price
 ----    -----------      -----

 124        shoes         59.99
 456        pants         49.50
 352        socks          3.99

Я пробовал "print ("% 8s% 5-s "% [c, d])" и "print ("% -8s% 5s "% [c, d])", но и это не правильно , По какой-то причине, когда я выравниваю описание (c), оно автоматически применяет его к цене (d). Что-то мне здесь не хватает?

1 Ответ

0 голосов
/ 15 ноября 2018

Ваш цикл b.each do |c,d| фактически выдает каждый элемент в массиве и пытается деструктурировать то, чего там нет, так что вы получите:

"%8s %5s" % ["shoes", nil]
"%8s %5s" % ["59.55", nil]

и т.д.

Вам просто нужно пропустить свой внутренний цикл:

itemHash.each do |a,b|
  print " #{a}     "
  print "%-8s %5s" % b
  puts
end

Или проще:

itemHash.each {|a, b| puts format(" %-8s%-8s%5s", a, *b) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...