2017-08-30 17 views
0

下面的程序是为了遍历holiday_hash,利用所有键和值,并把他们出去:Ruby程序没有按预期执行?如果块执行,尽管失败的情况

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

的问题是:

  1. 即使条件未能评估为true,if块也会执行。

建议需要:

  • 我怎么能简化资本谁在他们两个单词符号的过程,如:new_york资本化到纽约? (由于#capitalised方法将返回纽约)
  • 回答

    4

    if块,即使条件不计算为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块的执行只是因为条件始终为truthy

    为什么?因为它等同于:

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

    好吧..但为什么呢?我不知道发生了什么事。我现在更加困惑..很抱歉,这不是因为你的回答,而是你刚刚指出的事实。你能否进一步解释为什么会发生这种情况? –

    +0

    @ZeeshanShafqat对不起,我还在写我的答案,再次检查。 – Stefan