2016-11-17 42 views
2

好吧,所以我試圖刪除下劃線,如一些假期(例如,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) 
+1

爲什麼要急於選擇一個答案? –

回答

3

您可以使用這一個班輪

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" 
+0

def all_supplies_in_holidays(holiday_hash) \t holiday_hash.each do | seasons,holidays | \t \t holidays.each do |節日,用品| \t puts「#{seasons.to_s.capitalize}:」 \t puts「#{holidays.to_s.tr(」_「,」「).split('').map {| word | word.capitalize}。加入(」「)}#{supplies.join(」 「)}」 \t年底 \t 結束 結束 – Jun

+0

我實際上做了這樣的說法,而不是使用 「&」。它的目的是什麼? – Jun

+0

如果地圖不帶任何參數,則可以在映射某些東西時使用'&'。這與'{| i |'是一樣的i.capitalize}',只是更短。 –

0

使用遞歸,我們可以通過您的嵌套的哈希值,找到所有你的鑰匙,並應用更改:

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"]} 
#} 

這不正是你要求(只回答後實現),但我儘管如此,當你可能發現它有用。

0
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因爲後者將第一降低的情況下(以及資本的第一個字母)之後的所有字符,但提問者並沒有說這是希望的,或者有可能是大寫字母在每個單詞的第一個字符之後。