Ruby-удалить подчеркивания и прописные буквы


Хорошо, поэтому я пытаюсь удалить подчеркивания,как это видно в некоторых праздниках (например, fourth_of_july). Затем я хочу прописать каждое из слов.

Ожидаемый результат: fourth_of_july > четвертое июля

Итак, вот мой код:

holiday_dec = {

:winter => {
   :christmas => ["Lights", "Wreath"],
   :new_years => ["Party Hats"]
 },
 :summer => {
   :fourth_of_july => ["Fireworks", "BBQ"]
 },
 :fall => {
   :thanksgiving => ["Turkey"]
 },
 :spring => {
   :memorial_day => ["BBQ"]
 }

}

def all_supplies_in_holidays(holiday_hash)

  holiday_hash.each do |seasons, holidays|

    holidays.each do |holidays, supplies|
      puts "#{seasons.to_s.capitalize}:"
      puts "  #{holidays.to_s.tr("_"," ").capitalize}: #{supplies.join(", ")}"
    end

  end

end

all_supplies_in_holidays(holiday_dec)
5 5

5 ответов:

Вы можете использовать этот лайнер

str.split('_').map(&:capitalize).join(' ')

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

"fourth_of_july".split('_') -> ["fourth", "of", "july"]
["fourth", "of", "july"].map(&:capitalize) -> ["Fourth", "Of", "July"]
["Fourth", "Of", "July"].join(' ') -> "Fourth Of July"

В Rails можно использовать titleize

'fourth_of_july'.titleize => "Fourth Of July"

Https://apidock.com/rails/Inflector/titleize

holiday_dec.each_with_object({}) { |(k,v),h|
  h[k] = v.each_with_object({}) { |(kk,vv),g|
    g[kk.to_s.split('_').map { |s| s[0]=s[0].upcase; s }.join(' ')] = vv } }
  #=> {:winter=>{"Christmas"=>["Lights", "Wreath"], "New Years"=>["Party Hats"]},
  #    :summer=>{"Fourth Of July"=>["Fireworks", "BBQ"]},
  #    :fall=>{"Thanksgiving"=>["Turkey"]},
  #    :spring=>{"Memorial Day"=>["BBQ"]}}

Я использовал s[0]=s[0].upcase; s, а не s.capitalize, потому что последний преобразует все символы после первого в нижний регистр (а также заглавную первую букву), но Аскер не сказал, что это было желательно, или если бы могли быть заглавные буквы после первого символа каждого слова.

Используя рекурсию, мы можем пройти через ваш вложенный хэш, найти все ваши ключи и применить изменение:

def key_changer hash
  hash.map do |k,v|
    [ k.to_s.scan(/[a-zA-Z]+/).map(&:capitalize).join(' '),
      v.class == Hash ? key_changer(v) : v ]
  end.to_h
end

key_changer holiday_dec #=>

#{ "Winter" => { "Christmas"      => ["Lights", "Wreath"],
#                "New Years"      => ["Party Hats"] },
#  "Summer" => { "Fourth Of July" => ["Fireworks", "BBQ"] },
#  "Fall"   => { "Thanksgiving"   => ["Turkey"] },
#  "Spring" => { "Memorial Day"   => ["BBQ"]}
#}

Это не совсем то, что вы просили (понял только после ответа), но я оставлю этот ответ, тем не менее, как ВЫ можете найти его полезным.

Я пришел сюда в поисках способа изменить строку с подчеркиванием, чтобы она была больше похожа на имя класса. Рельсы имеют String#classify.

irb> 'some_class_string'.classify
=> "SomeClassString"