Подтвердить что ты не робот

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

... но это не работает. Итак, какой лучший способ справиться с такой ситуацией?

4b9b3361

Ответ 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()