96369


<https://github.com/rails/rails/tree/7-1-stable/railties/lib>

たとえば上記では「rails.rb というファイル」と「rails というフォルダ」があります。

また  
<https://github.com/rails/rails/tree/7-1-stable/actionpack/lib>  
では、

  * abstract_controller.rb
  * action_controller.rb
  * action_dispatch.rb
  * action_pack.rb

というファイルとそれに対応するフォルダが用意されています。

どういった意図があるのでしょうか？  
もしくは単にRails自体のなにかの慣習でしょうか？

[![画像の説明をここに入力](https://i.stack.imgur.com/yotatm.png)](https://i.stack.imgur.com/yotatm.png)

* * *

[![画像の説明をここに入力](https://i.stack.imgur.com/xjEZ4m.png)](https://i.stack.imgur.com/xjEZ4m.png)


CC BY-SA 4.0
2023-09-27T13:17:56.400
96360
2023-10-02T09:30:35.460
2023-09-28T08:41:39.837
19110
9008
question
ruby-on-rails ruby
Rubyでファイル名と同名のフォルダを用意するのはどういう意図があるのでしょうか？


ファイルの中で定義されているクラスやモジュールの名前とそのファイル名を合わせるという慣習があり、Ruby のプロジェクトで採用されていることがあります。また
Rails では自動ロードの仕組みと掛け合わせることで必須の慣習になっています。

たとえば hora.rb で `Hora` モジュールを定義して、hora/translator.rb で `Hora::Translator`
クラスを定義するといった次第です。

Rails では、定数、特にクラスやモジュールを読み込む際にディレクトリ名やファイル名を参照します。このため Rails
のプロジェクトでは必ず定数名とファイル名を意識します。参考:
<https://railsguides.jp/autoloading_and_reloading_constants.html>

Rails とは関係がない Ruby のプロジェクトでも似たようなディレクトリ構成がとられることがあります。RubyGems のドキュメントには
<https://guides.rubygems.org/patterns/#consistent-naming> や
<https://guides.rubygems.org/make-your-own-gem/#requiring-more-files>
のあたりで類似のルールが説明されています。また、rubocop にもこの慣習をチェックするためのルールとして
[Naming/FileName](https://docs.rubocop.org/rubocop/cops_naming.html#namingfilename)
の ExpectMatchingDefinition が存在します。


CC BY-SA 4.0
2023-09-28T04:22:11.380
96369
2023-09-28T21:32:57.223
2023-09-28T21:32:57.223
19110
19110
96360
answer


> どういった意図があるのでしょうか？  
>  もしくは単にRails自体のなにかの慣習でしょうか？

特に「意図」はありません。また元々は「慣習」によるものでもありません。Railsが何か特別というわけでもありません。Rubyの仕組み上、だいたいそういう構造になるのです。

# .rb のファイル

Rubyでは外部のライブラリを読み込むときに、`require 'hoge'`とします。これは実際にはライブラリの検索パスから、hoge.rb
(または.soなど)を探して読み込むという動きをします。

なので、「ライブラリ名.rb」というファイルは「あるべくしてある」ものです。

# ディレクトリ

さて大きなライブラリでは、クラスやモジュールの定義も、ファイルも分割しないと大変です。

クラスやモジュールは、階層構造をとることで、例えば`Hoge::HTTP`とか`Hoge::Database`のように分割します。こうすると、HTTPやDatabaseが他のライブラリとかぶっていても全体としてはユニークな名前になります。

これをファイルに分割する時のファイル名を考えます。  
hoge-fuga.rbみたいなファイル名にする例もありますが、大きなライブラリだといちいちhoge-
というprefixを付けるのも面倒ですし、大きなライブラリだと1階層に大量のファイルが並ぶことになるので、階層構造にしたくなります。そうするとクラスの階層にあわせて

[code]

    hoge/
     http.rb
     database.rb
    
[/code]

にしたくなるでしょう。

このとき先に出てきたhoge.rbではだいたい、

[code]

    require 'hoge/http'
    require 'hoge/database'
    
[/code]

をやっていてブートストラップとして機能します。ライブラリの利用者はいちいちライブラリの中身を調べなくても、`require
'hoge'`をやればいいわけです。

結果、まとめると

[code]

    hoge.rb
    hoge/
     http.rb
     database.rb
    
[/code]

という構造ができあがります。

実際にはライブラリとクラス名が違うような場合もあります。そのときは「ファイル名と同じディレクトリがある」ことにはなりません。

[code]

    例1:
    hoge-nanntoka.rb
    hoge/
    
    例2:
    hoge/
      fuga.rb
      fuga/
    
    #コードではrequire 'hoge/fuga'する
    
[/code]

# 慣習

ここまでで`require`の動作以外にルールとか慣習とかの話はしていません。あくまで「こうなりがち」という話です。「こうなりがち」なので実際にはその通りになってないものもあります。

現在ではこの話に沿ってツールが作られていたりするので、これについては「慣習」と言っても良いかもしれません。

# Rails

ここまででRailsの話は何も出てきていないことに注意してください。質問のファイル構造の話は(Railsを含む)Rubyのライブラリ一般にいえることなので、Railsに特化した話ではありませんし、Rails以前から成立している話なので、Railsがこの話に影響しているわけでもありません。

RailsはRubyのライブラリの1つなので、Railsと他のライブラリに共通して似ているところがあるのだとすると、Rails「に」それらが似ているのではなく、Rails「が」それらに似ているのが正しいです。(Railsが有名になりすぎたので、RailsとRubyの関係を誤って理解している例はたくさんあります)

自動ローディングはRailsがRailsを使ってプログラムを書く人のために提供している機能です。ファイル名とクラス名(など)の対応を「規約(慣習ではない)」にすることで、未定義のクラス名が出てきたら対応するファイルを`require`するという動きをします。ただこの規約は上記で説明した内容を反映しているだけで、繰り替えしになりますが上記はRailsでなくても成立します。つまり、質問のファイル構造の話に自動ローディングは何の影響も及ぼしません。


CC BY-SA 4.0
2023-10-02T09:30:35.460
96406
2023-10-02T09:30:35.460
5793
96360
answer