23 votes

Ruby : matrice conditionnelle ? cas avec plusieurs conditions ?

En ruby, je me demandais s'il y avait un moyen de faire ce qui suit :

J'ai essentiellement une matrice de quatre résultats possibles :

A is True, B is True
A is True, B is False
A is False, B is True
A is False, B is False

J'aimerais écrire un test pour cela de la manière la plus propre possible en "ruby".

J'espérais faire quelque chose comme

case[A,B]
  when A && B then ...
  when A && !B then ...
  when !A && B then ...
  when !A && !B then ...
end

... mais cela ne fonctionne pas. Alors, quelle est la meilleure façon de gérer ce genre de situation ?

53voto

tokland Points 29813

Cas booléen (sans expression dans le champ case il renvoie la première branche avec un sincère when_expr ):

result = case
when A && B then ...
when A && !B then ...
when !A && B then ...
when !A && !B then ...
end

Cas de correspondance (avec une expression dans le champ case il renvoie la première branche qui satisfait le prédicat 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

23voto

Mattias Arro Points 371

Si vous recherchez un cas avec une seule condition mais plusieurs correspondants

case @condition
  when "a" or "b"
    # do something
  when "c"
    # do something
end

puis vous en fait, j'en ai besoin :

case @condition
  when "a", "b"
    # do something
  when "c"
    # do something
end

Ceci peut être réécrit comme suit

case @condition
  when ("a" and "b")
    # do something
  when "c"
    # do something
end

Mais cela est quelque peu contre-intuitif, car cela équivaut à

if @condition == "a" or @condition == "b"

9voto

johusman Points 2212

Je ne sais pas s'il existe une méthode standard en Ruby, mais vous pouvez toujours les transformer en nombre :

val = (a ? 1 : 0) + (b ? 2 : 0)
case val
  when 0 then ...
  when 1 then ...
  when 2 then ...
  when 3 then ...
end

ou avoir un tableau de tableaux de procs et faire

my_procs[a][b].call()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X