2015-11-11 67 views
0

我想創建一個case檢查多個參數。多參數案例

Ruby: conditional matrix? case with multiple conditions?」 爲被一個扭轉基本上它:第二參數可以是三個值,abnil之一。

我希望只是延長when條件是這樣的:

result = case [A, B] 
    when [true, ‘a’] then … 
    when [true, ‘b’] then … 
    when [true, B.nil?] then … 
end 

有什麼建議?

+5

我覺得第三條應該有[tru e,nil]。另外,還不清楚你的問題是什麼 –

+0

我認爲你用[true,nil]回答了它;-) – Scott

+0

如果你所有的條件都以'true'開始,那麼不要包括'A'的測試,測試你的'B'值。否則你會不必要地拖慢測試。如果他們不這樣做,那麼我認爲你最終會得到一長串「when」聲明,這些聲明不會提高可讀性/可維護性或速度。那時我可能會把它分解成幾部分或找出更可讀的解決方案。 –

回答

1

在評論已經回答您的具體測試nil

result = case [A, B] 
    when [true, 'a'] then … 
    when [true, 'b'] then … 
    when [true, nil] then … 
end 

但你的問題激發了我更多的擴展問題:第二個參數可能是什麼,如果什麼?例如。你有這樣的決策表:

A B result 
------------------ 
a b true 
a _ halftrue 
_ b halftrue 
else false 

其中_什麼

一種可能的解決一個指標是一類,等於一切:

class Anything 
    include Comparable 
    def <=>(x);0;end 
end 

[ 
    %w{a b}, 
    %w{a x}, 
    %w{x b}, 
    %w{x y}, 
].each{|a,b| 

    result = case [a, b] 
    when ['a', 'b'] then true 
    when ['a', Anything.new] then :halftrue 
    when [Anything.new, 'b'] then :halftrue 
    else false 
    end 

    puts "%s %s: %s" % [a,b,result] 
} 

結果:

a b: true 
a x: halftrue 
x b: halftrue 
x y: false