LoginSignup
1
0

More than 3 years have passed since last update.

特定パスのファイルをまとめて require するワンライナー

Last updated at Posted at 2020-03-01

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 スクリプトを書かされる悲しい事件が起きたとき :sob: 、スクリプトを短く保つために機能ごとに module を分割することにしたのですが、module が増えるたびに rake ファイルに require 行を増やすのが美しくなかったため、読み込みを自動化できるようワンライナーで書いたのが冒頭のコードとなります

4. まとめ

#require ならレシーバーも省略できてややスッキリ書けますし、記述するのはファイルの冒頭なので、お決まりの書き方的な感じで、他のコーダーにも受け入れてもらいやすいかもしれません :upside_down:

みなさんもぜひ使ってみてくださいね :heart:

これらのショートハンドが動作する仕組みについては、以下の記事が詳しいです
参考: &演算子と、procと、Object#method について理解しなおす

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0