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
...但是,这是行不通的。那么,处理这种情况的最好方法是什么?
布尔案(与在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
不知道是否有一个标准的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()
+1为老派C招。我会使用'0b01'和'0b10'来清楚说明你真的在构建一个位图,而不是仅仅添加整数。 – 2011-02-25 01:03:10
如果你觉得奇怪:* [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"
标准压痕却将*当*在* *的情况下水平。 – tokland 2011-02-24 22:26:48
好的,谢谢你的提示 – Andrew 2011-02-24 22:29:35