2015-01-26 184 views
0

這裏是我試圖通過一個測試:紅寶石設置默認哈希值

def test_it_scores_a_double_word_score 
    play = Play.new(:word => "hello") 
    assert_equal 16, play.score(:word_multiplier => :double) 
    end 

這裏是我的類:

class Play < ActiveRecord::Base 

    before_save { self.word = word.downcase } 

    validates :word, presence: true, length: { maximum: 7 } 

    def letter_scores 
    {"A"=>1, "B"=>3, "C"=>3, "D"=>2, "E"=>1, "F"=>4, "G"=>2, "H"=>4, "I"=>1, "J"=>8, 
    "K"=>5, "L"=>1, "M"=>3, "N"=>1, "O"=>1, "P"=>3, "Q"=>10, "R"=>1, "S"=>1, "T"=>1, 
    "U"=>1, "V"=>4, "W"=>4, "X"=>8, "Y"=>4, "Z"=>10} 
    end 

    def score(word_multiplier: :single) 
    word_multiplier = {:single => 1, :double => 2, :triple => 3} 

    word.upcase.chars.inject(0){|sum, letter| sum + letter_scores[letter]} * word_multiplier 
    end 
end 

所以我的想法是,我需要的默認值散列爲:單個。如果關鍵字/值對:word_multiplier =>:double被傳遞,那麼我需要散列返回2.

我有語法問題: 1)我只使用=符號在方法中設置默認值,不是哈希。如何做到這一點?

2)我把word_multiplier::放在括號中的單個,似乎在設置默認值時工作。但是:word_multiplier =>:single不起作用。到底是怎麼回事?

回答

1

爲什麼使用符號/枚舉方案來設置乘數?我只是堅持一個數字:

def score(word_multiplier = 1) 
    word.upcase.chars.inject(0){|sum, letter| sum + letter_scores[letter]} * word_multiplier 
end 

如果你沒有通過方法的倍增器,它會默認爲1

如果您確實需要使用哈希默認參數,你這樣做以同樣的方式,你會任何其他類型的:

def my_method(options = {:multiplier => :single}) 
    multipliers = {:single => 1, :double => 2, :triple => 3} 
    word_multiplier = multipliers[options[:multiplier]] 
end 
1

你在做什麼作爲一個參數被分配一個默認word_multiplier,然後重新分配給word_multilier散,不使用傳入的參數最快的方法來解決這看起來像這樣:

word_multiplier = {:single => 1, :double => 2, :triple => 3}[word_multiplier] 

Nb。如果你希望人們使用你的代碼,直到人們停止使用Ruby 1.8.7和Ruby 1.9.3,我會避免使用關鍵字參數。