在红宝石中,我想知道是否有办法做到以下几点:
我基本上有四种可能结果的矩阵:
A is True, B is True
A is True, B is False
A is False, B is True
A is False, B is False
我想以最干净的“红宝石方式”为此写一个测试。
我希望做一些像
这样的事情case[A,B]
when A && B then ...
when A && !B then ...
when !A && B then ...
when !A && !B then ...
end
......但这不起作用。那么,处理这种情况的最佳方法是什么?
答案 0 :(得分:53)
布尔情况(case
中没有表达式,它返回带有 truthy when_expr
的第一个分支):
result = case
when A && B then ...
when A && !B then ...
when !A && B then ...
when !A && !B then ...
end
匹配大小写(使用case
中的表达式,它返回满足谓词when_expr === case_expr
的第一个分支):
result = case [A, B]
when [true, true] then ...
when [true, false] then ...
when [false, true] then ...
when [false, false] then ...
end
答案 1 :(得分:23)
如果您正在寻找具有一个条件但多个匹配器的案例..
case @condition
when "a" or "b"
# do something
when "c"
# do something
end
..那么你实际上需要这个:
case @condition
when "a", "b"
# do something
when "c"
# do something
end
这可以改写为
case @condition
when ("a" and "b")
# do something
when "c"
# do something
end
但这有点违反直觉,因为它等同于
if @condition == "a" or @condition == "b"
答案 2 :(得分:9)
不确定是否采用标准的Ruby方式,但您可以随时将它们转换为数字:
val = (a ? 1 : 0) + (b ? 2 : 0)
case val
when 0 then ...
when 1 then ...
when 2 then ...
when 3 then ...
end
或者有一系列procs数组并执行
my_procs[a][b].call()