根据比较选择红宝石中的哈希值

Spy*_*ros 1 ruby ruby-on-rails

请看一下这段代码:

fighter =  [:str => 2, :dex => 3, :mag => 3, :acc => 2, :hp => 2]
ranger =   [:str => 3, :dex => 2, :mag => 3, :acc => 2, :hp => 2]
magician = [:str => 3, :dex => 3, :mag => 2, :acc => 2, :hp => 2]
rate = Hash.new

if user.first_class == 'Fighter' then rate = fighter end
if user.first_class == 'Ranger' then rate = magician end
if user.first_class == 'Magician' then rate = ranger end

cost = Hash.new
cost[:str] = (user.strength_points + 1) * rate[:str]
cost[:dex] = (user.dexterity_points + 1) * rate[:dex]
cost[:mag] = (user.magic_points + 1) * rate[:mag]
cost[:acc] = (user.accuracy_points + 1) * rate[:acc]
cost[:hp]  = (user.health_points + 1) * rate[:hp]
cost
Run Code Online (Sandbox Code Playgroud)

这驻留在我已经创建的函数中,当我在Rails中执行它时,我得到一个"符号作为数组索引".我猜这是因为率=战士,率=魔术师或率=游侠的可能性.也许我必须使用克隆.

我的问题是,基于if比较选择哈希的更好方法是什么,做上述事情?

dby*_*rne 5

您正在创建Array一个条目,其中包含Hash:

fighter =  [:str => 2, :dex => 3, :mag => 3, :acc => 2, :hp => 2]
=> [{:str=>2, :dex=>3, :mag=>3, :acc=>2, :hp=>2}]
Run Code Online (Sandbox Code Playgroud)

你打算做的只是创建一个Hash:

fighter = {:str => 2, :dex => 3, :mag => 3, :acc => 2, :hp => 2}
=> {:str=>2, :dex=>3, :mag=>3, :acc=>2, :hp=>2}
Run Code Online (Sandbox Code Playgroud)

另外,if使用case语句而不是三个语句:

rate = case user.first_class
  when "ranger"
    ranger
  when "magician"
    magician
  when "fighter"
    fighter
end
Run Code Online (Sandbox Code Playgroud)

  • 或者,你甚至可以更进一步说'rate = eval(user.first_class.downcase)`如果安德鲁对这个问题的评论答案是'真'. (2认同)