Ruby设置默认哈希值

时间:2015-01-26 18:23:27

标签: ruby default-value

这是我想要通过的测试:

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

所以我的想法是我需要哈希的默认值为:single。如果键/值对:word_multiplier =&gt; :double传递,然后我需要哈希返回2。

我有语法问题: 1)我只在使用=符号的方法中设置默认值,而不是哈希值。如何做到这一点?

2)我在括号中输入了word_multiplier :: single,它似乎在设置默认值时起作用。但是:word_multiplier =&gt; :单身不起作用。发生了什么事?

2 个答案:

答案 0 :(得分: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 :(得分:1)

您正在做的是将默认值word_multiplier作为参数进行分配,然后将word_multilier重新分配给哈希值,而不使用传入的参数。解决此问题的最快方法是看起来像这样:

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

的Nb。如果您希望人们使用您的代码,直到人们停止使用Ruby 1.8.7和Ruby 1.9.3,我就会避免使用关键字参数。