Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

procのcurry化や部分適用とcase判定文との合わせ技で似た条件判定をスマートに書く

case文、便利ですよね。
フラグ管理なんかだと重宝します。
が、ちょっと複雑な事をやろうとすると
そんな時はProcを渡してあげると良くなるかもしれません

実際のところ

あまり適正な例では無いのですが……
ビットフィルタかけて、任意のビットが立ってるか否かを判定するcase文を想定してみます。

x = ARGV[0].to_i

base = -> (x,y){(x & y) == x}.curry
fltr_01 = base[0b01]
fltr_10 = base[0b10]

puts case x
     when fltr_01 then "01"
     when fltr_10 then "10"
     end

と、引数をもたずに条件だけで明示することができました。
しかも似たメソッドを一々書き直さず済むのでタイポも減ります。

Curry化を使わない方法

部分適用という方法をつかい

base = -> (x,y){(x & y) == x}
fltr_01 =-> x {base.(0b01,x)}
fltr_10 =-> x {base.(0b10,x)}

と書き換える事もできます。