尽管情况属实,为什么我的案例陈述失败?

时间:2016-11-09 16:34:56

标签: ruby

我正在研究一个根据五个六面骰子的角色来计算得分的卡塔。到目前为止,这是我的代码:

def score( dice )
    points = []
    score = {}
    dice.each do |n|
      if score.has_key?(n.to_s.to_sym)
        score[n.to_s.to_sym] += 1
      else
        score[n.to_s.to_sym] = 1
      end
    end

    score.each do |k,v|
      key_int = k.to_s.to_i

      case key_int
      when key_int == 1 && (v == 3)
        points << 1000
      when key_int == 6 && (v == 3)
        points << 600
      when key_int == 5 && (v == 3)
        points << 500
      when key_int == 4 && (v == 3)
        points << 400
      when key_int == 3 && (v == 2)
        points << 300
      when key_int == 2 && (v == 3)
        puts "did I get here"
      points << 200
      when key_int == 1 && (v < 3)
        points << key_int * v
      when key_int == 5 && (v < 3)
        points << key_int * v
      else
      puts "Default"
    end
  end
  points
end

puts score([2, 2, 2, 3, 3]) ==> 200

所以在这个例子的基本层面上,发生了什么,当我的每个循环点击哈希时,我得到以下条件:

key_int == 2 && (v == 3)

并将其插入到case语句之前的代码中,我得到的值为true,但我从未达到points << 200的条件。为简化起见,我将代码简化为案例逻辑。

score.each do |k,v|
  key_int = k.to_s.to_i
  case key_int
  when key_int == 2
    puts "I reached the condition"
  else
    puts "default"
  end
end

我仍然获得默认值,但我从未达到when条件。这让我很困惑。我可能做错了什么?

1 个答案:

答案 0 :(得分:4)

如果您在case之后立即指定对象,则会通过when将其与每个pattern === object模式进行比较。

在这个例子中:

case key_int
when key_int == 2
  # ...
end

它将key_intkey_int == 2进行比较,如下所示:

(key_int == 2) === key_int

假设key_int2,则上述内容变为:

true === 2

评估为false

要使用像case表达式这样的if-elsif表达式,您必须省略初始对象:

case
when key_int == 2
  # ...
end

有关另一个示例,请参阅JSON assertion library上的Ruby文档。