はじめに
システム開発第一事業部の奥田です。普段はフルスタックエンジニアとしてWebアプリの開発を担当しています。
直近でやっていた案件ではTypeScriptをゴリゴリに書いていたのですが、
案件が切り替わってRuby(Ruby on Rails)を使う案件に入ることになりました!
TypeScriptをやってみて思ったところは、やっぱりRubyって癖のある独自の世界観がありますね。
私の中のTypeScript脳をRuby脳に切り替えるついでに、せっかくならJavaScriptの非同期について記事にしたように、
Rubyに関しても何か記事を書けたらいいなと思い、今回は第1回として、Rubyのclassを整理していきます!
先ほども言いましたが、Rubyって一癖あるので初学者向けの言語として紹介されがちですが、
これまでの経験から言うとあんまり初学者向けじゃないようにも感じます。
なので、この独特な世界観を初学者が理解できる助け舟みたいなものを作りたいなと思ったのがきっかけです!
将来的にはclassだけではなくて、並列・並行処理についても書けたらいいなと思っています...
(過去にJavaScriptの非同期についても書いたので)
RubyのclassはTypeScriptなどのclassと同じ感覚で読むと途中で引っかかります。
最初は「インスタンスを作るための設計図」と理解して進みがちです。
ただ、実務のコードを読み始めると、その説明だけでは足りない場面が出てきます。
特に引っかかりやすいのが、クラス定義の中で普通にメソッド呼び出しが出てくるところです。
Railsではモデルでよく見るhas_manyとかだけでなく、ActiveSupport::Concernを使ってインスタンスメソッドやクラスメソッド、
関連定義をあとから差し込む書き方も出てきます。
ここでclassの見え方が一気に難しくなります。
たとえば、Railsを見ているとこんなコードが出てきます。
class Author < ApplicationRecord
has_many :books
end
Rubyではメソッド呼び出しの括弧を省略できます。
この前提を知らないと、次の1行がそもそもメソッド呼び出しに見えません。
「なぜクラス定義の中にいきなり:booksが出てくるのか」
「これは何をしている1行なのか」
と戸惑いやすくなります。
さらに「なぜクラス定義の中でメソッドを呼んでいるのか」という疑問も出ててくるかと思います。
ですが安心してください!
この疑問を言葉にできるようになると、Rubyらしい書き方がかなり読みやすくなります。
そのためにこの記事を書いたのですから!
というわけで、本記事のシリーズはは以下の3部構成で進めようかと思っています!
- 第1回(今回):
classの基本、クラス本体のself、initialize、クラスメソッドの見方までを整理。
- 第2回(予定): 継承、
include/extend/prepend、メソッド探索順、定数スコープ、可視性を扱う。
- 第3回(予定): その知識を使いながらRailsの
has_many、scope、コールバック、delegate、ActiveSupport::Concernと追い方を整理する。
途中で変わったりもするかもですのでご了承ください。
続きを読む