Ruby程序未按预期运行?尽管条件失败,但仍执行If块
以下程序旨在迭代holiday_散列,将所有键和值大写,并将其输出:Ruby程序未按预期运行?尽管条件失败,但仍执行If块,ruby,if-statement,Ruby,If Statement,以下程序旨在迭代holiday_散列,将所有键和值大写,并将其输出: 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 || :fou
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"]
}
}
问题是:
true
让我们看看:
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
我怎样才能简化大写有两个单词的符号的过程[…] 我将
按下划线拆分它们,将每个单词大写,然后将结果合并:
: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"
即使条件未能计算为true
让我们看看:
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
我怎样才能简化大写有两个单词的符号的过程[…]
我将按下划线拆分它们,将每个单词大写,然后将结果合并:
: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"
可以但为什么呢?我不知道发生了什么事。我现在更糊涂了。。对不起,这不是因为你的回答,而是因为你刚才指出的事实。你能进一步解释一下为什么会发生这种情况吗?@ZeeshanShafqat对不起,我还在写我的答案,再次检查。好的。。但为什么呢?我不知道发生了什么事。我现在更糊涂了。。对不起,这不是因为你的回答,而是因为你刚才指出的事实。你能进一步解释为什么会发生这种情况吗?@ZeeshanShafqat对不起,我还在写我的答案,请再次检查。