Рубин: условная матрица?случай с несколькими условиями? - PullRequest
23 голосов
/ 25 февраля 2011

В 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

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

Ответы [ 3 ]

53 голосов
/ 25 февраля 2011

Логический регистр (без выражения в case, возвращается первая ветвь с truey 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
23 голосов
/ 20 марта 2011

Если вы ищете дело с одним условием, но с несколькими сопоставителями ..

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"
9 голосов
/ 25 февраля 2011

Не уверен, что существует стандартный способ 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()
...