web-dev-qa-db-ja.com

Ruby:条件付き行列?複数の条件がある場合?

Rubyでは、次のことを行う方法があるかどうか疑問に思っていました。

私は基本的に4つの可能な結果のマトリックスを持っています:

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

...しかし、それは機能しません。それで、この種の状況を処理するための最良の方法は何ですか?

23
Andrew

ブールの場合(caseに式がない場合、最初のブランチをtruthywhen_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
53
tokland

条件が1つで、マッチャーが複数あるケースを探している場合。

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"
23
Mattias Arro

標準のRubyの方法があるかどうかはわかりませんが、いつでも数値に変換できます。

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

またはprocの配列の配列を持っていて

my_procs[a][b].call()
9
johusman