💎

【初心者向け】1+1から順に学ぶRubyのオブジェクト指向

2024/06/12に公開

ここにたどり着いたということは、特にRubyを使っていてオブジェクト指向について学びたいと思っている方だと思います。

オブジェクト指向って何か分からないけど、調べたら出てくるのは「犬はワンワン鳴くが猫はニャーニャー鳴く」とか、わかりやすいのかわかりにくいのか、わかったのかわかってないのかもよくわからない、クソマジメなエンジニアたち(おそらく優秀)が書いてくれたであろう怪文書がたくさん出てきてウンザリしますよね。

また、知りたい情報を知るためにRubyのリファレンスマニュアルのどこをどう読めばいいのかという読み方も説明します。「現役エンジニアが解説!」みたいなどこかの田●とかいう人が金目的で量産しているコピペ記事を読むよりも、リファレンスマニュアルを自力で読むほうが世界は良くなります。

このチュートリアルを手を動かしながらいろいろ試して読んで理解できたとき、クソマジメなエンジニアたちが書いた文書をスッキリ理解し、知りたい情報を自分で調べることができ、エンジニアとして自立する階段の1段目に到達することでしょう。

では、さっそく irb を起動してRubyを動かしてみましょう。

$ irb

あっ、もし irb コマンドで起動できないとか困ったときには、まずRubyのインストールがちゃんとできてるか確認してくださいね。

さて、まず1+1から順に学ぶということなので、Rubyに1+1を計算させてみましょうかね。

irb(main):001:0> 1 + 1
=> 2

2になりました。何を当たり前なことをやってるんだと思いました? では、これはどうでしょうか?

irb(main):002:0> "1" + "1"
=> "11"

あれ、少し変わっただけなのに今度は11になっちゃうんですね。この差はなんでしょうか。Rubyは、数値と文字列を区別して扱います。 1 と書けば数値になり、 "1" と書けば文字列になるのです。文字列に対して + を使うと、文字列をくっつけて、結果が "11" となります。この違いは、数値と文字列のクラスが違うからです。クラスと言われてもよくわからないので、実際にクラスを調べてみましょうかね。クラスを調べるには、 class メソッドを使います。

irb(main):003:0> 1.class
=> Integer
irb(main):004:0> "1".class
=> String

はい、 1Integer クラス、 "1"String クラスということがわかりました。クラスが違うと、 + の動きが違うんですね。

では、次は日付を扱う Date クラスを見ていきましょう。 Date.today とすると、今日の日付を取得することができます。

irb(main):005:0> Date.today
(irb):5:in `<main>': uninitialized constant Date (NameError)

Date.today
^^^^
Did you mean?  Data

あっ、エラーが出ちゃいました。そうでした、 date組み込みライブラリではなかったのでした。Rubyでは組み込みライブラリならそのまま使うことができるのですが、その範囲ではない機能を使いたいときは require してやる必要があります。あっ、でも多くの人はRuby on Railsを使っているかもしれませんね。Ruby on Railsでは、自動で必要なライブラリを読み込んでくれるので、 require する必要はありません。今回は irb でRubyを動かしていてRuby on Railsの機能を読み込んでいないので、 require する必要があります。

irb(main):006:0> require 'date'
=> true
irb(main):007:0> Date.today
=> #<Date: 2024-06-12 ((2460474j,0s,0n),+0s,2299161j)>

なんか出てきました。よくわからないけど、今日の日付が 2024-06-12 と出ていることは分かります。今日の日付を取得することができていそうです。では、先ほどと同じように + を使ってみましょう。

irb(main):008:0> Date.today + 1
=> #<Date: 2024-06-13 ((2460475j,0s,0n),+0s,2299161j)>

明日の日付になりました。1日未来の日付になるということになり、 Integer String とはまた別の動作をするのですね。

では、いちおうこれも class メソッドで調べてみましょうか。

irb(main):009:0> Date.today.class
=> Date

Date クラスだということがわかりました。

ここまでで、クラスによって + の動作が違うことがわかりました。では、実際にリファレンスマニュアルを読んでみましょう。Rubyのリファレンスマニュアルはこちらです。リファレンスマニュアルは英語で書かれていることが多いですが、Rubyは日本生まれの言語なので日本語の情報が充実しています。

ここでよく使うであろうページは、まずは2つだけ覚えてください。

  1. 組み込みライブラリ
  2. 標準添付ライブラリ

リファレンスマニュアルを読むとき、90%以上はこの2つのページからたどれるページを見ることになります。今日はこの2つのどこを見るのか理解しましょう。 Date は組み込みライブラリではないので require が必要でした。ですので、 require なしで使えていた IntegerString に関する情報は組み込みライブラリにあります。 Date に関する情報は標準添付ライブラリにあります。それぞれのクラスのページを見つけて、「インスタンスメソッド」に + があるはずなので説明を確認してみてください。それぞれどのような動作をするのか説明があるはずです。

あっ、実はこれが、クソマジメなエンジニアが大好きな「犬はワンワン鳴くが猫はニャーニャー鳴く」ということなんです。「 Integer+ すると足し算、 String+ すると文字列をくっつける、 Date+ するとその日数だけ先の日付を計算する」ということなんです。「主語が何かによって、同じ『鳴く(もしくは + )』でも動作が違うよね」ということです。オブジェクト指向的な用語でいうと、多態性(ポリモーフィズム)というやつです。

ここ初心者の方にむちゃくちゃ意識してほしいところなのですが、なんのクラスに対して + するのかによって動きがまったく違うので、 + って何やってるんだろうということだけを調べても正しい答えにたどり着くのは難しいです。Rubyを使うときは、「コイツは何クラスだ?」と常に考えながらプログラムを書く必要があります。何クラスか分からなくなってきたら、こまめに irb や、Ruby on Railsなら rails console を使って、 class メソッドを呼びクラスを確認し、リファレンスマニュアルを開くことが大切です。

ちなみに、 + はRubyではメソッド呼び出しです。メソッドなので、 class メソッドのように . をつけて呼び出すこともできます。

irb(main):010:0> 1.+(1)
=> 2

Rubyではメソッド名が一部の記号で構成されている場合、 . を省略して呼び出すことができます。同じメソッド名でもクラスによって動作が違うのです。

では最後に応用問題です。足し算をしながらオブジェクト指向の雰囲気をつかんだので、割り算をやってみましょう。

irb(main):011:0> 4 / 2
=> 2
irb(main):012:0> 5 / 2
=> 2
irb(main):013:0> 5.0 / 2
=> 2.5

えっ、 5 / 22 になりました。でもでも、 5.0 / 2 だと 2.5 になります。なんででしょうか。 class メソッドで何クラスなのかを調べて、リファレンスマニュアルを読んでいくと理由がわかるはずですので、説明してみてください。

ヒント: 5.0 のクラスを調べるには、 5.0.class とします

Discussion