Ruby 设置默认哈希值

Ruby setting default hash value

这是我要通过的测试:

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

这是我的 class:

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。如果 key/value 对 :word_multiplier => :double 被传递,那么我需要散列到 return 2.

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

2) 我在括号中输入了 word_multiplier: :single ,这似乎可以设置默认值。但是 :word_multiplier => :single 不起作用。怎么回事?

为什么要使用 symbol/enum 方案来设置乘数?我只想坚持一个数字:

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

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

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

铌。如果您希望人们在人们停止使用 Ruby 1.8.7 和 Ruby 1.9.3.

之前使用您的代码,我会避免使用关键字参数