読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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)}

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