Rails のソースコードを読んでみた

こんにちは!趣味と実益を兼ねてプログラマをしている hikaru-kimi です!!

普段、皆さんはどのようにプログラミング学習をされてますか?

ご自身でアプリケーションを作成されたり、本を読んで知識を身に着けたり、人それぞれだと思います!

かく言う私は、趣味の延長でライブラリのソースコードを読むことも多々あります!

ライブラリのソースコードを読むなんて敷居が高いなと思ったそこのあなたのために、 本日は一緒にライブラリのソースコードを読み解いていきましょう!

題材はスバリ、弊社サービス「Re:lation」で用いられている Ruby on Rails (以下 Rails)です!

Railsは、ActiveRecord や ActiveModel といった複数のライブラリ群で構成されています。

今日は、初学者でも比較的とっつきやすい ActiveSupport の Array class について取り扱いたいと思います!

version は 6.1 系でお話します。

実際の class 定義は以下のリンクにあります。

https://github.com/shunyama/rails/blob/v6.1.4.1/activesupport/lib/active_support/core_ext/array/access.rb

色々とメソッドが定義されてますね!

適当に見ていくと、second というメソッドが定義されてます!

  def second
    self[1]
  end

https://github.com/shunyama/rails/blob/90357af08048ef5076730505f6e7b14a81f33d0c/activesupport/lib/active_support/core_ext/array/access.rb#L59-L61

定義を読むとお分かりのように、配列の2番目の要素を返すメソッドですね!

普段何気なく利用していますが、改めて定義を読むと「こんなに単純な定義だったんだ」と、ある意味感動すら覚えますね!

直下には third, fourth, fifth というメソッドが定義されてます。

これらも簡単なので分かりやすいですね!

ちなみに first がないのは、Rails ではなく Ruby 本体の Array クラスにて定義済みだからです。

ActiveSupport は Ruby の拡張を目的としてますので、重複した定義はなされないということです。

fifth までは定義されてますが、sixth, seventh, …は存在しないみたいですね。

実際に ActiveSupport が使用可能な環境で実行してみましたが、sixth だと NoMethodError が発生します。

irb(main):003:0> [1,2,3,4,5,6,7,8,9,10].sixth
Traceback (most recent call last):
        2: from (irb):2
        1: from (irb):3in `rescue in irb_binding'
NoMethodError (undefined method `sixth' for [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:Array)

これくらいなら簡単に定義できそうですし、私なんかからするとコントリビュートチャンスでは?と思ってみたりします!

(ニーズをコミッター陣に説明できないと reject されそうではありますが…!やってみる価値はありそうですね!)

その後もメソッドを追っていきますと、唐突に fourty_two というメソッドが現れます!

その名の通り、配列の42番目の要素(インデックスでいうと41番目)を返すメソッドにはなりますが、2, 3, 4, 5と来てどうして42という微妙な数字なのでしょうか??

以後 43, 44, …と続くわけでもなく、ますます疑問が深まります。

そんなときはコメントを読んでみましょう!

コメントに意味深な文がありますね!

# Equal to <tt>self[41]</tt>. Also known as accessing "the reddit".

https://github.com/shunyama/rails/blob/90357af08048ef5076730505f6e7b14a81f33d0c/activesupport/lib/active_support/core_ext/array/access.rb#L84

the reddit というのはアメリカの有名なWeb掲示板のことだそうですが、いまいち関係性が分かりません…

また、「42」という数字は西洋では「Answer to the Ultimate Question of Life, the Universe, and Everything」(訳: 「生命、宇宙、そして万物についての究極の疑問の答え」)を意味するそうです。

情報源が Wikipedia で恐縮ですが、ダグラス・アダムズのSF小説「銀河ヒッチハイク・ガイド」で登場するフレーズのことだそうです。

出展: 生命、宇宙、そして万物についての究極の疑問の答え - Wikipedia

茶目っ気で定義したのでしょうか?それとも sixth, seventh, …と定義するのが面倒になって、それこそ「生命、宇宙、そして万物についての究極の疑問の答え」として包括的に定義したのでしょうか?

fourty_two メソッドの定義の意図についてお分かりの方、是非とも以下のリンクより弊社採用サイトにご応募いただいた上で、カジュアル面談の場でお聞かせください!!