2016-11-09 45 views
2

我正在研究基于五个六面死的角色来计分的卡塔。这是我到目前为止的代码:尽管条件成立,为什么我的病例陈述失败?

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) 

并将其插入到案例陈述之前的代码,我得到的值为true,但我从未达到points << 200的条件。为了简化,我把这个代码削减为case逻辑。

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条件。这让我很困惑。我可能做错了什么?

+2

您必须使用'case'而不是'case key_int'。 – Stefan

+0

我错过了什么吗?这个博客告诉我,否则http://blog.honeybadger.io/rubys-case-statement-advanced-techniques/ –

+0

博客文章使用lambda和自定义matcher类通过'=='和'<'进行比较。 – Stefan

回答

4

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

在这个例子中:

它将比较key_int针对key_int == 2这样的:

(key_int == 2) === key_int 

假设key_int2,上述变为:

true === 2 

其评估至 false

要使用case表达像if-elsif表达式,你必须忽略初始对象:

case 
when key_int == 2 
    # ... 
end 

见Ruby的上case Expression的另一个例子文档。