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)
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)
不确定是否有标准的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)