Ruby:条件矩阵?多个条件的情况?

时间:2011-02-24 22:07:31

标签: ruby matrix conditional switch-statement

在红宝石中,我想知道是否有办法做到以下几点:

我基本上有四种可能结果的矩阵:

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

......但这不起作用。那么,处理这种情况的最佳方法是什么?

3 个答案:

答案 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()