1. はじめに
はじめに結論!
Dir.glob(Rails.root.join('lib', 'tasks', 'module', '*')).each(&method(:require))
2. そもそも
Array#map
などに、ブロックではなく、 &:メソッド名
を渡すショートハンドは、Ruby に慣れた方なら割と使っているかもしれません
irb(main):001:0> [1, 2, 3].map(&:to_s)
=> ["1", "2", "3"]
ところで、この配列の要素を、レシーバー側ではなく、引数側に取りたい場合は、 #method
メソッドを用いて以下のような書き方ができます
irb(main):002:0> [1, 2, 3].map(&2.method(:eql?))
=> [false, true, false]
ただこの書き方は、ややテクニカル過ぎてかえってコードが読みづらくなるため、あまり使うことはないだろうと思っていました
3. 何があったのか
ところが、仕事が4つも5つもある、妙に多機能な rake task スクリプトを書かされる悲しい事件が起きたとき 、スクリプトを短く保つために機能ごとに module を分割することにしたのですが、module が増えるたびに rake ファイルに require 行を増やすのが美しくなかったため、読み込みを自動化できるようワンライナーで書いたのが冒頭のコードとなります
4. まとめ
#require
ならレシーバーも省略できてややスッキリ書けますし、記述するのはファイルの冒頭なので、お決まりの書き方的な感じで、他のコーダーにも受け入れてもらいやすいかもしれません
みなさんもぜひ使ってみてくださいね
これらのショートハンドが動作する仕組みについては、以下の記事が詳しいです
参考: &演算子と、procと、Object#method について理解しなおす