Ruby:条件矩阵?有多种情况的情况?

Ruby:条件矩阵?有多种情况的情况?

问题描述:

在Ruby中,我想知道如果有一种方法可以做到以下几点:Ruby:条件矩阵?有多种情况的情况?

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

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

标准压痕却将*当*在* *的情况下水平。 – tokland 2011-02-24 22:26:48

+0

好的,谢谢你的提示 – Andrew 2011-02-24 22:29:35

布尔案(与在case无表达,它返回一个truthywhen_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 
+2

好吧,那很整齐。 – johusman 2011-02-24 22:24:50

+1

好的,第二个选项是我正在寻找的。真棒! – Andrew 2011-02-24 22:30:19

+0

伟大的第二种解决方案。 – 2013-07-31 14:37:47

不知道是否有一个标准的Ruby的方式,但你总是可以把它们变成一个数字:

val = (a ? 1 : 0) + (b ? 2 : 0) 
case val 
    when 0 then ... 
    when 1 then ... 
    when 2 then ... 
    when 3 then ... 
end 

或有特效的数组的数组,并做

my_procs[a][b].call() 
+2

+1为老派C招。我会使用'0b01'和'0b10'来清楚说明你真的在构建一个位图,而不是仅仅添加整数。 – 2011-02-25 01:03:10

+3

如果你觉得奇怪:* [a,b] .each_with_index.map {| x,i | (x?1:0) tokland 2011-02-25 08:00:44

如果你正在寻找的情况下与一个条件,但多的匹配..

case @condition 
    when "a" or "b" 
    # do something 
    when "c" 
    # do something 
end 

..then你确实需要这样

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"