Ruby - 删除下划线并大写
Ruby - remove underscores and capitalize
好吧,我正在尝试删除下划线,就像在某些假期中看到的那样(例如,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)
你可以用这个衬垫
str.split('_').map(&:capitalize).join(' ')
这需要一个字符串 str
并在下划线所在的位置拆分它,然后将每个单词大写,然后用 space 将这些单词连接在一起。例子
"fourth_of_july".split('_') -> ["fourth", "of", "july"]
["fourth", "of", "july"].map(&:capitalize) -> ["Fourth", "Of", "July"]
["Fourth", "Of", "July"].join(' ') -> "Fourth Of July"
使用递归,我们可以遍历您的嵌套哈希,找到您的所有键并应用更改:
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"]}
#}
这不完全是您的要求(回答后才意识到),但我还是会保留这个答案,因为您可能会觉得它有用。
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
因为后者将第一个字符后的所有字符转换为小写(以及首字母大写),但提问者并没有说那是需要或每个单词的第一个字符后是否可以有大写字母。
在Rails中你可以使用titleize
'fourth_of_july'.titleize => "Fourth Of July"
我来这里是为了寻找一种方法来修改带有下划线的字符串,使其更加 class-name-like。 Rails 有 String#classify
.
irb> 'some_class_string'.classify
=> "SomeClassString"
好吧,我正在尝试删除下划线,就像在某些假期中看到的那样(例如,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)
你可以用这个衬垫
str.split('_').map(&:capitalize).join(' ')
这需要一个字符串 str
并在下划线所在的位置拆分它,然后将每个单词大写,然后用 space 将这些单词连接在一起。例子
"fourth_of_july".split('_') -> ["fourth", "of", "july"]
["fourth", "of", "july"].map(&:capitalize) -> ["Fourth", "Of", "July"]
["Fourth", "Of", "July"].join(' ') -> "Fourth Of July"
使用递归,我们可以遍历您的嵌套哈希,找到您的所有键并应用更改:
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"]}
#}
这不完全是您的要求(回答后才意识到),但我还是会保留这个答案,因为您可能会觉得它有用。
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
因为后者将第一个字符后的所有字符转换为小写(以及首字母大写),但提问者并没有说那是需要或每个单词的第一个字符后是否可以有大写字母。
在Rails中你可以使用titleize
'fourth_of_july'.titleize => "Fourth Of July"
我来这里是为了寻找一种方法来修改带有下划线的字符串,使其更加 class-name-like。 Rails 有 String#classify
.
irb> 'some_class_string'.classify
=> "SomeClassString"