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
Я хотел бы написать тест для этого самым чистым способом "ruby".
Я надеялся сделать что-то вроде
case[A,B]
when A && B then ...
when A && !B then ...
when !A && B then ...
when !A && !B then ...
end
... но это не работает. Итак, какой лучший способ справиться с такой ситуацией?
Ответы
Ответ 1
Булевой регистр (без выражения в case
, он возвращает первую ветвь с правдой 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
Ответ 2
Если вы ищете случай с одним условием, но несколько совпадений.
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"
Ответ 3
Не уверен, есть ли стандартный Ruby-путь, но вы всегда можете превратить их в число:
val = (a ? 1 : 0) + (b ? 2 : 0)
case val
when 0 then ...
when 1 then ...
when 2 then ...
when 3 then ...
end
или иметь массив массивов procs и do
my_procs[a][b].call()