使用include的Ruby Ruby Case语句?不管用

时间:2010-10-04 17:59:31

标签: ruby case

我有以下代码,其中包含一个小错误,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

谢谢!

3 个答案:

答案 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语句的对象的值,而不仅仅是运行一堆模糊相关的ifwhen - 子句与===语句的对象进行了比较。因此,如果您撰写case,则表示CATEGORY_CLASSES[:boats].include?(category_id)if true === category_id(因为if false === category_id返回true或false)。

你想要的更像include?