2016-11-17 6 views
2

これで、いくつかの休日に表示されるように(たとえば、four_of_july)、アンダースコアを削除しようとしています。次に、それぞれの単語を大文字にしたいと思います。Ruby - アンダースコアを削除して大文字にする

期待される結果:fourth_of_july 7月

の>第四には、そう、これは私のコードです:あなたは

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

この1つのライナーを使用することができます

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を取り、それを分割アンダースコアがある場合は、各単語を大文字にしてから、単語をスペースで結合します。例私たちはすべてのあなたの鍵を見つけて、変更を適用し、あなたのネストされたハッシュを通過することができます再帰使用

"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 | holidays、supplies | \t puts "#{seasons.to_s.capitalize}" \tは、 "#{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"]}} 

Iはs[0]=s[0].upcase; sなくs.capitalizeを用い、まだすることができればアスカーはそれが望まれていたと言うか、しませんでした各単語の最初の文字の後の大文字。ラッシュが答えを選択するために、なぜRailsでは

関連する問題