2015-01-26 119 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,我会避免使用关键字参数。