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

And*_*rew 23 ruby conditional matrix 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
Run Code Online (Sandbox Code Playgroud)

我想以最干净的"红宝石方式"为此写一个测试.

我希望做类似的事情

case[A,B]
  when A && B then ...
  when A && !B then ...
  when !A && B then ...
  when !A && !B then ...
end
Run Code Online (Sandbox Code Playgroud)

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

tok*_*and 53

布尔情况(在没有表达式的情况下case,它返回带有truthy 的第一个分支when_expr):

result = case
when A && B then ...
when A && !B then ...
when !A && B then ...
when !A && !B then ...
end
Run Code Online (Sandbox Code Playgroud)

匹配大小写(在表达式中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
Run Code Online (Sandbox Code Playgroud)

  • 好的,那很漂亮. (2认同)
  • 真棒!这是一张真相表! (2认同)

Mat*_*rro 23

如果您正在寻找具有一个条件但多个匹配器的案例..

case @condition
  when "a" or "b"
    # do something
  when "c"
    # do something
end
Run Code Online (Sandbox Code Playgroud)

..然后你真的需要这个:

case @condition
  when "a", "b"
    # do something
  when "c"
    # do something
end
Run Code Online (Sandbox Code Playgroud)

这可以改写为

case @condition
  when ("a" and "b")
    # do something
  when "c"
    # do something
end
Run Code Online (Sandbox Code Playgroud)

但这有点违反直觉,因为它等同于

if @condition == "a" or @condition == "b"
Run Code Online (Sandbox Code Playgroud)


joh*_*man 9

不确定是否有标准的Ruby方式,但您可以随时将它们转换为数字:

val = (a ? 1 : 0) + (b ? 2 : 0)
case val
  when 0 then ...
  when 1 then ...
  when 2 then ...
  when 3 then ...
end
Run Code Online (Sandbox Code Playgroud)

或者有一系列的procs数组和do

my_procs[a][b].call()
Run Code Online (Sandbox Code Playgroud)

  • 如果你觉得好奇:*[a,b] .each_with_index.map {| x,i | (x?1:0)<< i} .inject(:+)*;-) (3认同)
  • 旧学校C技巧+1.我使用`0b01`和`0b10`来表明你真的在构建一个位图,而不仅仅是添加整数. (2认同)