以下程序旨在在假日_hash上迭代,资本化所有键和值并将其列出:
def all_supplies_in_holidays(holiday_hash)
holiday_hash.each do |key, value|
key_string = key.to_s
key_string.capitalize!
puts "#{key_string}:"
value.each do |key2, value2|
if key2 == :new_year || :fourth_of_july || :memorial_day
key_to_string = key2.to_s
key_string1 = key_to_string.split
final_array = []
key_string1.each do |splitted_string|
final_array = splitted_string.capitalize!
end
final_string = final_array.join(" ")
print "#{final_string1}:"
else
key_string1 = key2.to_s
print "#{key_string1}"
end
value2.each do |array_value|
new_array_capitalized = []
new_array_capitalized << array_value.capitalize!
new_array.join(" ")
end
end
end
end
预期的输出格式为:
Winter:
Christmas: Lights, Wreath
New Years: Party Hats
Summer:
Fourth of July: Fireworks, BBQ
Fall:
Thanksgiving: Turkey
Spring:
Memorial Day: BBQ
holiday_hash如下:
{
:winter => {
:christmas => ["Lights", "Wreath"],
:new_years => ["Party Hats"]
},
:summer => {
:fourth_of_july => ["Fireworks", "BBQ"]
},
:fall => {
:thanksgiving => ["Turkey"]
},
:spring => {
:memorial_day => ["BBQ"]
}
}
问题是:
- 即使条件未能评估为true,if块也执行。
需要的建议:
- 我如何简化资本化符号的过程,这些符号中有两个单词,例如:new_york被大写到纽约?(因为#Capitalised方法将返回纽约)
即使条件未能评估到
,true
if
块也会执行
让我们看看:
key2 = :new_year
key2 == :new_year || :fourth_of_july || :memorial_day
#=> true
现在应该返回 false
:
key2 = :thanksgiving
key2 == :new_year || :fourth_of_july || :memorial_day
#=> :fourth_of_july
这不是您的预期结果,但是您的假设也不正确:if
块是仅仅因为条件总是真实的。。
为什么?因为它等同于:
false || :fourth_of_july || :memorial_day
#=> :fourth_of_july
您想要:
key2 == :new_year || key2 == :fourth_of_july || key2 == :memorial_day
#=> false
或稍小一点:
[:new_year, :fourth_of_july, :memorial_day].include? key2
#=> false
我如何简化有两个单词的资本化符号的过程[...]
我会通过下划线split
,每个单词capitalize
和join
结果:
:new_year
.to_s #=> "new_year"
.split('_') #=> ["new", "year"]
.map(&:capitalize) #=> ["New", "Year"]
.join(' ') #=> "New Year"
我已经分开了方法调用以显示中间结果。您可以在一行中写上述内容:
:new_year.to_s.split('_').map(&:capitalize).join(' ')
#=> "New Year"