我正在研究一个根据五个六面骰子的角色来计算得分的卡塔。到目前为止,这是我的代码:
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
条件。这让我很困惑。我可能做错了什么?
答案 0 :(得分:4)
如果您在case
之后立即指定对象,则会通过when
将其与每个pattern === object
模式进行比较。
在这个例子中:
case key_int
when key_int == 2
# ...
end
它将key_int
与key_int == 2
进行比较,如下所示:
(key_int == 2) === key_int
假设key_int
为2
,则上述内容变为:
true === 2
评估为false
。
要使用像case
表达式这样的if-elsif
表达式,您必须省略初始对象:
case
when key_int == 2
# ...
end
有关另一个示例,请参阅JSON assertion library上的Ruby文档。