我有以下代码,其中包含一个小错误,case语句返回值“other”,即使第一个“when”语句的计算结果为true,也应返回“boats”。
我一直在看这个年龄,一定是小事。
CATEGORIES = {:boats => [1, 2, 3, 4, 5, 6],
:houses => [7, 8, 9, 10],
:other => [11,12,13,14,15,16]
}
category_id = 1
category = case category_id
when CATEGORY_CLASSES[:boats].include?(category_id); "boats"
when CATEGORY_CLASSES[:houses].include?(category_id); "houses"
else "other"
end
谢谢!
答案 0 :(得分:43)
您可以在时语句中展开数组,如下所示:
category = case category_id
when *CATEGORY_CLASSES[:boats]; "boats"
when *CATEGORY_CLASSES[:houses]; "houses"
else "other"
end
答案 1 :(得分:11)
case
语句通常只是if
语句的简写。你的可以改写为:
if CATEGORY_CLASSES[:boats].include?(category_id) === category_id
category = "boats"
elsif CATEGORY_CLASSES[:houses].include?(category_id) === category_id
category = "houses"
else
category = "other"
end
当你以这种形式看待它时,你应该清楚地看到问题;当include?
返回一个布尔值时,你将它与一个整数值进行比较。
答案 2 :(得分:7)
(我将忽略这样一个事实:你的哈希实际上并不包含你正在检查的任何密钥,并假装你正在检查实际上在哈希中的密钥。希望这是正确的假设。)子>
您似乎误解了case
声明是什么。它正在测试case
语句的对象的值,而不仅仅是运行一堆模糊相关的if
。 when
- 子句与===
语句的对象进行了比较。因此,如果您撰写case
,则表示CATEGORY_CLASSES[:boats].include?(category_id)
或if true === category_id
(因为if false === category_id
返回true或false)。
你想要的更像include?
。