Rubyで配列に対するinclude?(x)の論理積をどう書くか
先日のどう書くで次のようなコードを書き、疑問に感じました。ダサすぎる……。
if wall.include?(e) && wall.include?(w) && wall.include?(n) return s, "S" elsif wall.include?(n) && wall.include?(e) && wall.include?(s) return w, "W" elsif wall.include?(e) && wall.include?(s) && wall.include?(w) return n, "N" [...] end
というわけで、教えていただいた書き方を整理します。皆さまありがとうございます。
No. | 書き方 | 教えてくれた人 |
---|---|---|
1 | ([e, w, n] - ar).empty? | 神速さん、ゆろよろさん |
2 | [e,w,n].all?{|x| ar.include? x } | まきさん、鍋谷さん |
3 | [e,w,n].all?(&ar.method(:include?)) | しえるさん |
4 | Set[e, w, n].subset? ar.to_set | yancyaさん |
短くてカッコいいのは1、動作がわかりやすいのは2、意図がわかりやすいのは4だと感じました。
というわけで、書き捨てのコードでは1を、その後も使うコードでは2か4を使おうと思います。
問題は3で、これはマジすごいですね。
methodメソッドが、arからinclude?メソッドを取り出して、Methodオブジェクトを返します。ブロックを引数に取れるall?メソッドには、to_procメソッドを持つオブジェクトを&で修飾して渡せます(Methodオブジェクトはto_procメソッドを持ちます)。実行時にtp_procメソッドが呼び出されます。
……ということだそうです。えーと。今のところ使わないと思いますが、すごいなと思いましたw