2017-08-30 23 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