すがブロ

sugamasaoのhatenablogだよ

かんたんに検証用のMySQLレプリケーション環境を作る

docker-composeで動かすくんです

DockerでMySQLを使うのも、レプリケーションの設定をするのも個別には難しくないのですが、Docker MySQL環境変数を毎回調べるのが面倒、レプリケーションするときのposition取得が面倒などがあり、シュッと立ち上がる環境を作っておきたくなったのでした。

github.com

設定を見てもらえればわかると思いますが、検証目的のテキトー設定なので間違ってもプロダクション環境で利用しないでくださいね

Ruby on Rails 6 エンジニア 養成読本という本を共著で執筆しました

f:id:seiunsky:20191005004542j:plain
Ruby on Rails 6 エンジニア 養成読本

まずはじめに

  • 10/26 発売
  • 電子版は同日か少し遅れて発売予定 10/19追記 : 技術評論社電子書籍サイトから購入可能になりました
  • @netwillnet さんと共著です
  • Rails 6.0対応の書籍としてはそれなりに早いタイミングでの出版だと思います
    • 執筆しているときは最速で出したいという思いがありましたが、実際のところ最速なのかはわからないです😅

どのような本ですか?

目次はこんな感じです

巻頭特集 ようこそRuby on Railsの世界へ~ここが変わった! Rails 6の新機能~

- Action Textによるリッチテキスト機能の追加
- 複数の DB へ接続を行う機能の追加
- Action Mailboxによるメール受信機能の追加

特集1 Rails 6ではじめるRuby on Rails再入門

- 第1章 RubyとRailsの基礎知識
- 第2章 Railsコマンドの基本
- 第3章 Rails の開発を体験しよう
- 第4章 Rails アプリケーションを公開しよう

特集2 Rails 6からのイマドキ フロントエンド開発

- 第1章 webpack へ変わったJavaScriptの管理
- 第2章 SprocketsによるCSSの管理
- 第3章 Railsに標準で組み込まれているJavaScript
- 第4章 控えめなJSフレームワークStimulus

特集3 Rails新時代の組み込みテスト

- 第1章 Railsに標準で組み込まれているテストの種類と並列テスト
- 第2章 ユニットテストでテストを書こう
- 第3章 システムテストでアプリケーション全体の動作を確認する

一般記事    押さえておきたい! Rails 6で改善された機能一覧

- Active Storageによるファイルアップロード
- credentials による秘密情報の管理
- Early HintsやCSPへの対応

どのような人が対象ですか?

各特集・記事ごとに対象読者レベルは多少異なりますが大きく分けると以下のような感じです。

普段Railsを使っているが6.0についてはあんまりキャッチアップできてない……という人

  • 巻頭特集・特集2・一般記事
    • 主に、6.0になって変更になった部分に主眼を置いた解説になっています
    • 新しく追加された Action Text や 改善された credentials の解説があるので、どこらへんが変わったのか手軽にキャッチアップしたい人にオススメです
    • 特集2ではJavaScript周りをWebpackerで扱う方法などを解説しています

Railsを使うことになったがよくわからんのだよな・・・(あるいは、久しぶりにRails触って見るか!)という人

  • 特集1・特集2・特集3
    • 特集1はrubyやgemの使い方から簡単なrails newの使い方など初歩的な使い方について解説しています
      • 他言語をやっていて、これからRubyを触るような人にオススメです
    • 特集2, 特集3では6.0で変更内容がある部分は反映しているので、ここら辺は経験者が全く読む価値がないというわけではないです(きっと……)

個人的なオススメ内容

一部はruby-jpというコミュニティ*1でも話した内容ですが・・・

  • credentialsの解説は、今までの機密情報の扱い方の経緯を振り返り、6.0ではどうなっているの?ということを解説しています。この機能は紆余曲折あって色々変わっているので、きちんと流れを追って最新の形をスッと知ることができるのは便利かなと思います
  • あとは単純に複数DBとかデフォルトになったWebpackerあたりの解説があるのは便利ジャンという感じがあります

謝辞

この書籍を執筆するにあたって、@y_yagiさん、@madogiwa_boyさんにレビューしていただけました。 しょうもないミスから説明不足な点など、第三者の目で見ていただけたことでグッとクオリティをあげることができました。本当にありがとうございます 🙇‍♂️

ご購入は

gihyoさんやAmazonなどで購入できます(なんかamazonのリンクだとプレビューがうまく表示されないのでリンクだけ・・・)

gihyo.jp

https://www.amazon.co.jp/o/ASIN/4297108690/

繰り返しになりますが、電子版も近いうちに発売する予定ですのでそちらをご所望の方はもうしばしお待ちください

以下のサイトから電子書籍版を購入することが可能です(10/19追記)。

gihyo.jp

それはそれとして、私が執筆に関わった書籍はこれで5冊目になりました(パーフェクトRubyの改定作業をカウントすると6冊)。褒めてくれて良いんですよ??? https://www.amazon.co.jp/-/e/B00EEQ6M1M

*1:詳しくはここら辺をご確認ください https://pocke.hatenablog.com/entry/2019/08/02/181140

令和の時代、hirbに変わるツールはあるのか問題

表形式の方がパッとみたときに分かりやすい反面、カラムが多いと表形式じゃない方が見やすいとかもあるのでケースバイケースなのですが、まあ敢えて剥がすほどでもないかなと思って使い続けて数年。

開発が活発ではないので、そろそろ次世代的なものが出てきているのか、あるいは人類は表形式じゃなくてもやっていけるのか。

hirb is 何

こんな感じに表示されるActiveRecordのオブジェクトに対して

irb(main):002:0> Blog.all
  Blog Load (0.4ms)  SELECT "blogs".* FROM "blogs" LIMIT ?  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Blog id: 1, title: "cool title", body: "cool text", created_at: "2019-10-07 06:37:13", updated_at: "2019-10-07 06:37:13">]>

Gemfileにhirbを追加してbundle installすると

irb(main):002:0> Hirb.enable
=> true
irb(main):003:0> Blog.all
  Blog Load (0.2ms)  SELECT "blogs".* FROM "blogs"
+----+------------+-----------+-------------------------+-------------------------+
| id | title      | body      | created_at              | updated_at              |
+----+------------+-----------+-------------------------+-------------------------+
| 1  | cool title | cool text | 2019-10-07 06:37:13 UTC | 2019-10-07 06:37:13 UTC |
+----+------------+-----------+-------------------------+-------------------------+
1 row in set

こんな感じしてくれる君です。ただ、このままだと日本語などでカラムの幅がずれてしまう。

そのため、hirbを使うときは同時にhirb-unicodeも利用するとシュッと表示されるようと思いきやメンテされてない問題があってforkしたhrib-unicode-steakknifeを使う*1。こっちは動く程度にはメンテされているので、シュッと動きます。

というのがhirb関連の動きなわけですが

そもそも世の中の人は使ってるんですか???という疑問をアンケートにしてみました。

結果を見ると、hirbを利用している割合と同じくらいの人が(!!!)「代替gemを使っている」という選択をしてくれました。 しかし、残念なことにリプライは無かったので具体的に何を使っているかは不明です。

悲しいですね😇

とちぎRuby会議08「Rubyを説明するのは難しい(仮)」という内容で登壇してきました

はじめてのとちぎRubyコミュニティ

とちぎのRubyコミュニティ、もちろん前から知っている存在だったのですが、なんというか非常に練度の高い場所というイメージがあって、ちょっと怖いけど*1いつか行ってみたいな〜と思っていた存在でした*2

Tochigi RubyKaigi 08

今回、主催しているtoRubyのよねざわさんから「参加しませんかー」とお誘いいただき、これは良い機会だと思ってホイホイ参加することにしました。

発表もどうですか?と誘っていただいたものの、前述の通り練度高い場というイメージがあって「よく考えたら自分には無理では、、」と及び腰になっていたのですが、色々と励ましてもらったおかげで登壇する運びとなりました*3

話してきた内容

speakerdeck.com

昨年、かんたんRubyという入門書を書いた経験をベースに、「どう説明するのが良いのかなあ」というお悩み相談みたいな感じで話の骨格を作りました。 Rubyのイベントだし、Rubyの本なのでRubyが主体ですが、本質的にはプログラミングの入門書全般で言えることかな〜というのは登壇した後に思ったりしました。あんまりRubyは良くない!みたいに思わないでね;;

◆◇◆ 閑話休題 ◆◇◆

予定では本編25分 + 余った時用のスライド + 質疑応答で30分くらいみたいなイメージだったのですが、思ったより早く進行してしまい、余った時用のスライドを使っても22〜3分?くらいで終わっちゃったのは反省点です*4

ですが、結果としては質問してくださった皆さんのおかげでより深く「どう説明すれば良いか」を考えるきっかけを得られたので、とても良かったです。

特に、発表後に @yhara さんや @youchan さんに自分の本ではこういう説明したよとかこういう流れだと良いよねなんて話をできたのはとても嬉しかったです。ウッウッ発表して良かった!

youchanさんからはマンガでわかるRubyをいただいたので、これを気にRubyをわかっていきたいと思います!(こういう、動かしてみてプログラミングが楽しい!みたいな流れを「かんたんRuby」ではうまく表現できていないと思うので、今後に生かしたい気持ちもあります)

その他

  • toRubyの雰囲気がすごくやわらかくて、とても発表しやすくて良かった(とって喰われるんじゃあないかとビビってたw)
  • オブジェクト指向について sumim さんの話を聞けて大変勉強になりました
  • 久しぶりに角谷さんのトークが聞けたの良かった
  • @june29と@mamipekoのトークは我が家でも参考になりそう
  • なんやかんやあって懇親会で全員がちょっとLTするみたいな異常な展開になってて楽しかった
    • かくたにさんがめちゃくちゃ煽ってたw というのもあるけど、多分toRubyの皆さんのホスピタリティの高さというか、心理的安全性があるというか、雰囲気がすごく良かったというのもあると思う

個人的な話

  • 登壇で緊張していたというのもあるけれどかなり人見知りを発揮してしまって、もうちょっとしっかりしなさいよ、という反省点があります

  • ふと客観的に自分を見ると、だいぶムチついてますね・・・。やせよう

  • 今回、発表することができてとても良かった。このような機会を得られたこと、そして過ごしやすいイベントを開催していただいたこと、toRubyの皆さん、本当にありがとうございました!

いちおう宣伝

ほーん良さそうな事書いてるジャン?と思ったらこちらをポチッとお願いします。

かんたん Ruby (プログラミングの教科書)

かんたん Ruby (プログラミングの教科書)

これからプログラミングに入門するぞ!度合いはこちらの方が高い感じになっておりますので、Ruby超入門もあわせてよろしくお願いします。

ゼロからわかる Ruby 超入門 (かんたんIT基礎講座)

ゼロからわかる Ruby 超入門 (かんたんIT基礎講座)

*1:実際は怖くなかったです

*2:出不精なもんで県外になると途端に参加できなくなる病が発病してしまい、なかなか参加できていないのであった

*3:一般枠かと思っていたら招待講演枠だったことに後から気が付いたのは別のお話

*4:もともと、平常時に練習して30分オーバーからの、当日は緊張してスピードが上がってしまうのを考慮した見積もりだったにも関わらず、なので完全に見積もりミス

Rails 6のコマンド周りで変わる細かい点(rc1調べ)

ブログを書くリハビリ

Rails 6.0で変わるであろうと思われる点のメモ

これのもうちょっと正確な説明ですが、bin/rails updatebin/rails setup の話の前に bin/rails db:prepare の説明が必要なんです。

rails db:prepare タスクの追加

PRはこちら https://github.com/rails/rails/pull/35768

タスク名より実装を見たほうがわかりやすいですが、DBが作成されていれば migrate を、そうでなければ setup を実行するタスクです。migrateとsetupの使い分けをしなくて良い便利タスクですね。

# PRのFiles Changedから抜粋
  task prepare: :load_config do
    ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
      ActiveRecord::Base.establish_connection(db_config.config)
      db_namespace["migrate"].invoke
    rescue ActiveRecord::NoDatabaseError
      db_namespace["setup"].invoke
    end
  end

bin/rails updatebin/rails setupbin/rails setup に統合

こちらが本題ですが、実装がほとんど同じジャン?ということでupdateはsetupを実行する形に変更されました。上記で追加された db:prepare を使うことで、動作的にもupdateとsetupを使い分けずとも同じ挙動になったわけですね。

これもPRを見たほうがわかりやすいでしょう https://github.com/rails/rails/pull/33139

そのうちupdateは無くなるんですかね。

かんたんRubyという書籍を執筆しました(6/21発売)

表題の通りですが、もうすぐ技術評論社から「かんたんRuby」というRubyの入門書が発売されます。

f:id:seiunsky:20180620081212p:plain

かんたんRuby is 何

技術評論社から出版している「プログラミングの教科書」シリーズのRuby版です。

http://gihyo.jp/book/series?s=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8

基本的にはプログラミングの経験があまり無い人向けの入門書という位置付けです。

gihyo.jp

対象読者

  • なんとなくターミナルの操作ができる
    • 難しいことはしていませんが、全く触ったことないとちょっと大変かも
  • プログラミングは初めて、あるいはちょっと触ったことがある

これくらいの経験の方向けに、Rubyを通じてプログラミングを経験してもらえると良いなと思っています。

目次

  • 1章 Rubyを始めよう
    • 01 Rubyとは
    • 02 Rubyの特徴
    • 03 開発環境の構築
    • 04 エディタの準備
    • 05 プログラムの入出力
    • 06 プログラムの実行
  • 2章 Rubyの基本を学ぼう
    • 01 Rubyをより深く学ぶために
    • 02 プログラムのはじまりとおわり
    • 03 変数とは
    • 04 オブジェクトとメソッド
    • 05 演算子とは
    • 06 コメントをつける
    • 07 インデント
  • 3章 変数
    • 01 変数の種類
    • 02 擬似変数
    • 03 定数
    • 04 nilオブジェクト
  • 4章 数値と演算子
    • 01 数値オブジェクト
    • 02 算術演算子
    • 03 シフト演算子とビット演算子
    • 04 比較演算子
    • 05 Integerのよく使われるメソッド
    • 06 Floatのよく使われるメソッド
  • 5章 文字列
  • 6章 制御構造
    • 01 条件分岐とは
    • 02 繰り返し処理
  • 7章 配列/レンジ/ハッシュ
    • 01 配列オブジェクト(Array)
    • 02 配列でよく使われるメソッド
    • 03 レンジオブジェクト(Range)
    • 04 ハッシュオブジェクト(Hash)
    • 05 ハッシュでよく使われるメソッド
    • 06 配列とレンジ,ハッシュのまとめ
  • 8章 メソッド
    • 01 メソッド定義
    • 02 メソッドと戻り値
    • 03 ブロック付きメソッド
  • 9章 クラスの基本
    • 01 クラスとは
    • 02 クラスにメソッドを定義する
    • 03 再び変数について
    • 04 アクセッサメソッド
    • 05 メソッドと可視性
    • 06 クラスの継承
    • 07 別ファイルを読み込む
    • 08 クラスと抽象化
  • 10章 モジュール
    • 01 モジュールとは
    • 02 モジュールを名前空間として使う
    • 03 モジュールでMix-inを実現する
    • 04 トップレベルや名前空間と値の探索順
  • 11章 例外処理
    • 01 例外処理とは
    • 02 例外を捕捉する
    • 03 例外を発生させる
  • 12章 組み込みライブラリ
    • 01 Timeクラス
    • 02 Fileクラス
    • 03 Dirクラス
  • 13章 標準添付ライブラリ
    • 01 標準添付ライブラリとは
    • 02 日付クラス(Timeクラスの拡張)
    • 03 CSVを扱う(CSVクラス)
    • 04 JSONを扱う(JSONクラス)
    • 05 YAMLを扱う(YAMLクラス)
    • 06 一時ディレクトリ/ファイルを扱う(tmpdir/tempfile)
    • 07 ファイルの操作を行う(FileUtilsモジュール)
    • 08 プログラムのテスト
  • 14章 組み込みツール
    • 01 irb
    • 02 RDoc
    • 03 Rake
    • 04 RubyGems
    • 05 Bundler
  • Appendix より高度なRubyの知識

本書を通じて、独り立ちできるように

これは「はじめに」にも書いてあるんですが、とにかく、自分がプログラミングを始めた時に一番困ったのは、入門書に書いてあることは理解できても、その後「どう調べていけば良いのか」がよくわからなかったという記憶があります。

そのため、本書では細かく本文中にリファレンスマニュアルのURLを記載しています。

このような文章を読むことで、わからないことがあったらまずはリファレンスマニュアルを見れば良いんだな、という体験をしてもらいたいという狙いがあります。

また、あまり深くは踏み込んでいないのですが、正規表現エンコード、テストについても解説があります。

これらをはじめとして「知らないとハマる」類のものや、初心者向けの説明としては不要と思われるかもしれないけれど、世の中のコードを見るときに知らないと意味がわからない類のものは適宜解説を入れているつもりです。

この本を読めば中級者になれる!とかそういうのは難しいかもしれませんが、ある程度自分で調べる分別が着くようになってほしいーーつまり独り立ちするための基礎体力がつくように、というコンセプトで執筆しました。

👏お礼👏

本書を書くにあたって、 @willnet さん、 @koemu さんにレビューをしてもらいました。なかなかタイトなスケジュールになってしまったにも関わらず、快く引き受けていただいて本当に嬉しかったです。ありがとうございました><

Rubyの動作について完全に思い違いしていた部分や、プログラミングの説明で難しいなーとついボヤかした部分などをズバッと指摘してもらって、かなりクオリティが高まったというか、本当に見てもらって助かりました……。余談ですが、頭がイカれていたのかGemfileを異常にtypoしていた(日常生活ではそんなことほとんどない)のをめっちゃ指摘してもらったのが印象深いです😇

購入はこちら

紙の書籍

Amazonで買えます(執筆時点では予約購入)。

かんたん Ruby (プログラミングの教科書)

かんたん Ruby (プログラミングの教科書)

あるいは、先行入荷している以下の書店では在庫があれば本日購入することが可能です!

電子書籍

技術評論社電子書籍サイトでEPUB/PDF版を購入できます。

かんたん Ruby | Gihyo Digital Publishing … 技術評論社の電子書籍

あるいは、AmazonKindle版を購入することもできます。

かんたん Ruby プログラミングの教科書

かんたん Ruby プログラミングの教科書

どちらもリフロー版とのことです。

良いなと思ってくれた方はぜひamazonのレビューなどに記載してくれるととても嬉しいです。おかしい点や改善点があれば技術評論社の書籍ページからいけるお問い合わせか、私に伝えてもらえると今後の改善につながるかもしれません。

それはそれとして単著 is 辛い

私は今まで、パーフェクトRuby, パーフェクトRuby on Rails, Webアプリエンジニア養成読本という書籍を共著で執筆してきました。 今回は色々あって単著という運びになったのですが、とにかく想像を絶する厳しさでほぼイキかけました

何が辛いかって、

  • 自分がやらないと進まない
  • 自分がやらないと進まない
  • 自分がやらないと進まない
  • 自分がやらないと進まない
  • 自分がやらないと進まない

本当にこれに尽きるというか、共著の場合はチームで誰かが執筆している気配があると良い意味でプレッシャーになって自分も書かなくてはという感じになるのですが、とにかく自分一人しかいないのでやらないと何も進まないんですよね……。

チームでやるのは、それはそれで苦労があるのですが単著というのはとにかく夏休みの宿題をギリギリまでやらないタイプのスタンド使いとは相性悪いのではないか😇

色々あって自分が手元でテキストベースの原稿を執筆した期間がおよそ3ヶ月(その後はDTPしてPDFになった原稿での調整や見直しがある)で、その後の加筆修正なども考慮するとだいたい24万文字くらい書いた感じですが、とにかく執筆期間は人間性を捨てて時間を作っていた結果3kgくらい太って厳しみがあります(こんなの人生で初めて)。

そんなわけで、結構苦労して書いたのでもし本屋さんで見かけたらどんなもんかチラ見くらいしてもらえると幸いです(良いと思ったら買ってね!)。

Rubyのnilクラスを調べたい

nilクラスが実際にどうなってるのか調べたい

Rubyの実装がどうなっているか、一年に365回くらいは調べたくなると思うのですが、今日はnilクラスについて調べました。

Rubyの組み込みクラスは(多分)リポジトリ直下にそれぞれ、それっぽい名前.cとして存在しているのですが、nilについてはどうやらそうではない模様。

GitHub - ruby/ruby: The Ruby Programming Language

仕方がないので頑張って探してみましょう。

おもむろに git grep nil

rubyリポジトリをgit cloneしてきて*1、おもむろに git grep nil。当たり前だけど普通にnilばっか出てきてダメですね;;

よく考えればnilはクラスではないのでクラス名で検索しないとダメだろう。というわけでNilClassを調べます。念のため書いておきますが、nilのクラスは以下のようにして調べることができますよ。

irb(main):001:0> nil.class
=> NilClass

気を取り直して、おもむろにgit grep NilClass。これでも結構たくさんの結果が出てきてしまいました。ここから目grepするだけでも目的のものはわかるのですが、もうちょっと楽をするために.cのみで検索してみましょう。

% git grep NilClass -- "*.c"
class.c:    SPECIAL_SINGLETON(Qnil, rb_cNilClass);
class.c: *       NilClass, TrueClass and FalseClass.
complex.c:    rb_define_method(rb_cNilClass, "to_c", nilclass_to_c, 0);
ext/json/generator/generator.c:             mTrueClass, mFalseClass, mNilClass, eGeneratorError,
ext/json/generator/generator.c:static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self)
ext/json/generator/generator.c:    mNilClass = rb_define_module_under(mGeneratorMethods, "NilClass");
ext/json/generator/generator.c:    rb_define_method(mNilClass, "to_json", mNilClass_to_json, -1);
object.c:VALUE rb_cNilClass; /*!< NilClass class */
object.c: *  <code>false</code>, it returns NilClass, TrueClass, or FalseClass,
object.c: *     nil.singleton_class         #=> NilClass
object.c: * Document-class: NilClass
object.c:    rb_cNilClass = rb_define_class("NilClass", rb_cObject);
object.c:    rb_define_method(rb_cNilClass, "to_i", nil_to_i, 0);
object.c:    rb_define_method(rb_cNilClass, "to_f", nil_to_f, 0);
object.c:    rb_define_method(rb_cNilClass, "to_s", nil_to_s, 0);
object.c:    rb_define_method(rb_cNilClass, "to_a", nil_to_a, 0);
object.c:    rb_define_method(rb_cNilClass, "to_h", nil_to_h, 0);
object.c:    rb_define_method(rb_cNilClass, "inspect", nil_inspect, 0);
object.c:    rb_define_method(rb_cNilClass, "&", false_and, 1);
object.c:    rb_define_method(rb_cNilClass, "|", false_or, 1);
object.c:    rb_define_method(rb_cNilClass, "^", false_xor, 1);
object.c:    rb_define_method(rb_cNilClass, "===", rb_equal, 1);
object.c:    rb_define_method(rb_cNilClass, "nil?", rb_true, 0);
object.c:    rb_undef_alloc_func(rb_cNilClass);
object.c:    rb_undef_method(CLASS_OF(rb_cNilClass), "new");
rational.c:    rb_define_method(rb_cNilClass, "to_r", nilclass_to_r, 0);
rational.c:    rb_define_method(rb_cNilClass, "rationalize", nilclass_rationalize, -1);
spec/ruby/optional/capi/ext/constants_spec.c:static VALUE constants_spec_rb_cNilClass(VALUE self) {
spec/ruby/optional/capi/ext/constants_spec.c:  return rb_cNilClass;
spec/ruby/optional/capi/ext/constants_spec.c:  rb_define_method(cls, "rb_cNilClass", constants_spec_rb_cNilClass, 0);
sprintf.c:      if (value == rb_cNilClass) {
vm.c:    if (klass == rb_cNilClass) return NIL_REDEFINED_OP_FLAG;
vm.c:          C(NilClass), C(TrueClass), C(FalseClass));

かなり人間がわかるような量になりました。 これで必要な情報はほぼわかったようなものですが、実装はobject.cにあるようです。

object.c 👀

もはや説明不要なレベルですが、先ほどの結果を抜粋すると、object.cのここら辺が見るべきポイントのようですね。

object.c:    rb_cNilClass = rb_define_class("NilClass", rb_cObject);
object.c:    rb_define_method(rb_cNilClass, "to_i", nil_to_i, 0);
object.c:    rb_define_method(rb_cNilClass, "to_f", nil_to_f, 0);
object.c:    rb_define_method(rb_cNilClass, "to_s", nil_to_s, 0);
object.c:    rb_define_method(rb_cNilClass, "to_a", nil_to_a, 0);
object.c:    rb_define_method(rb_cNilClass, "to_h", nil_to_h, 0);
object.c:    rb_define_method(rb_cNilClass, "inspect", nil_inspect, 0);
object.c:    rb_define_method(rb_cNilClass, "&", false_and, 1);
object.c:    rb_define_method(rb_cNilClass, "|", false_or, 1);
object.c:    rb_define_method(rb_cNilClass, "^", false_xor, 1);
object.c:    rb_define_method(rb_cNilClass, "===", rb_equal, 1);
object.c:    rb_define_method(rb_cNilClass, "nil?", rb_true, 0);

あまりCの実装には詳しくありませんが、少なくともrb_define_class でNillClassを定義していて、rb_define_method(rb_cNilClass, ...) でメソッド名と実装の紐付けを行なっていることがわかります。 例えば、to_inil_to_iで実装されているようですね。このnil_to_iも同じobject.cで実装されているのでみてみましょう。

static VALUE
nil_to_i(VALUE obj)
{
    return INT2FIX(0);
}

こんな感じでゼロを返すという強い意志を感じます。

というわけで、NilClassの実装を見ることができました。まあ今回のポイントはどのファイルで実装されているのか?というのを調べる部分で、それはobject.cでした、ということですね。

合わせて読みたい

あんまり関係ないけどこちらもよろしくお願いします

改訂2版 パーフェクトRuby

改訂2版 パーフェクトRuby

*1:実際はruby/rubyghqで手元に取得済みなのであった