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