Part12:クラス

ヨハネ「ほーっほっほっほっ!今度こそこのヨハネが、Rubyの神秘たる知恵の実を授ける時よ!さあリトルデーモンたち、堕天使ヨハネを畏れ敬いなsあ痛っ!」
マル「五百羅漢普陀落渡海!」
ルビィ「わあ、久しぶりに見たこの展開」

ヨハネ「・・・気を取り直してクラスについてよ。Rubyはオブジェクト指向言語。クラスを抜きにしては語れないわっ」
マル「そもそも、オブジェクト指向って何ずら?」
ヨハネ「何かの概念の実体を表すオブジェクトとその間のメッセージパッシングによって成り立つプログラミングモデル・・・なんてのは今はどうでもいいわ」
ルビィ「いいんだ・・・」
ヨハネ「コードは口ほどに物を言うのよ。四の五の言わずにこれを見なさい」

Aqoursの黒澤ルビィ、15才です!
μ’sの高坂穂乃果、16才です!

ヨハネ「基本的な要素はこれに凝縮されてるわね」
ルビィ「classっていうのが出てきてるね」
ヨハネ「そう、そのclassの部分がクラスの定義よ」
マル「で、クラスって?」
ヨハネ「大雑把に言うと型よ。今までも数値とか文字列とか配列とかハッシュとか出てきたでしょ?」
マル「うん」
ヨハネ「あれも実は全部、IntegerとかFloatとか、StringとかArrayとかHashとかいうクラスだったのよ!」
ルビィ「えーと・・・な、なんだってー」
ヨハネ「・・・やる気を削がれる反応ね・・・まあとにかく、ここで定義しているのはアイドルという概念を表すクラスよ」
マル「アイドルという・・・概念?」
ヨハネ「クラスは型。個々のアイドル1人1人ではないのよ。例えば文字列だったら、Stringクラスに対して”ruby”や”maru”はStringオブジェクト、またはインスタンスと呼ぶわ」
マル「なるほど・・・」


オブジェクトの生成

ヨハネ「じゃあ、コードを見てみましょ。クラスの定義は後回しでいいわ。下の4行を見ると、Idol.newってしてるわね」
ルビィ「ルビィと、穂乃果ちゃんのところだよね」
ヨハネ「そこがIdolクラスのインスタンスを作っているところよ。今まで見てきた組み込みのクラスは専用のリテラルが用意されていたけど、これが本筋」
マル「じゃあ、new使う書き方もできたってこと?」
ヨハネ「そうよ。例えばArray.newみたいに書けば空の配列ができるわ」


メソッドの呼び出し

ヨハネ「ruby.introduceみたいなコードもあるわね。これはIdolオブジェクトであるrubyのintroduceメソッドを呼び出す書き方よ」
ルビィ「えーっと、同じIdolクラスのインスタンスだけど、rubyとhonokaは別のオブジェクトだから、結果も違う、と」
ヨハネ「そう。これで、オブジェクトの作り方と使い方は分かったわね」


クラスの定義

ヨハネ「次はクラスの定義にいくわよ。基本的にはメソッドが並べて書いてあると思えば大丈夫だけど」
マル「うん、initializeintroduceがあるな」
ヨハネ「initializeは特別なメソッドね。Idol.newしたときに呼び出されるようになっているわ」
ルビィ「初期化用?」
ヨハネ「そんなところね。もう1つのintroduceは普通のメソッドよ」


インスタンス変数

ヨハネ「あと説明が必要なのは・・・@nameからいきましょうか」
マル「変数っぽいんだけど・・・」
ヨハネ「インスタンス変数と呼ばれる変数ね。インスタンスごとに値が管理される変数」

ヨハネ「ruby = Idol.new "黒澤ルビィ", 15, "Aqours"っていうコードがあるわよね?これを実行すると、Idolクラスのinitializeメソッドに3つの引数が渡される」
マル「それは分かるずら」
ヨハネ「initializeでは@name = nameってしてるわね。これで@nameというインスタンス変数には”黒澤ルビィ”が入ったことになる」
マル「それも分かるずら」
ヨハネ「ここでintroduceメソッドを見ると、@nameが使われてるわね。引数とかで渡されたわけじゃなく」
マル「あ、ほんとだ」
ヨハネ「このインスタンス変数は、そのクラスの全てのメソッドで利用できるのよ」
マル「普通の変数とはスコープが違うんだな」
ヨハネ「それに、さっきルビィちゃんが言ってた通り、このコードではrubyとhonokaは別のオブジェクト。だからそれぞれ別の値を持ってるの」
マル「オブジェクトごとに持ってる値は違うけど、できる処理は同じってことだな」


アクセサ

ヨハネ「仕上げはアクセサね。最初のatt_readerとかattr_accessorとかのことよ」
ルビィ「さっきのインスタンス変数と関係ありそうだよね」
ヨハネ「ええ。インスタンス変数はオブジェクトの中ではどこからでも見えるけど、オブジェクトの外からは見えないの。それを公開するための書き方よ」

高坂穂乃果
16
μ’s
A-RISEの高坂穂乃果、16才です!

ヨハネ「こういうことができるわけ。名前や年齢は変わらないからattr_readerで読み取り専用に、グループは移籍とかあるからattr_accessorで読み書き可能にしてるわ」
ルビィ「ほ、穂乃果ちゃんは、μ’sを離れたりしないよ!」
ヨハネ「物の例えよ・・・。あと、書き込み専用のattr_writerもあるけど、これ使い道がよくわからないのよね・・・」


クラス変数とクラスメソッド

ヨハネ「インスタンス変数はインスタンスごとに管理されるって話をしたけど、クラスごとに管理される変数の話もしないといけないわね」

START:DASH!!
現在のメンバーは3人です
これからのSomeday
現在のメンバーは7人です

ヨハネ「@@countあたりに注目してみればいいかしら」
ルビィ「えっと、人数を数えてるんだよね。インスタンスじゃなくてクラスが、人数を覚えてるっていうこと?」
ヨハネ「そう、この@@で始まる変数はクラス変数といって、Idolクラスの全てのインスタンスが共有する変数なのよ」
マル「それをinitializeで1ずつ増やしてるから、Idol.newの都度カウントアップされてくんだな」
ヨハネ「それからIdol.countね。これはクラスメソッドといって、インスタンスじゃなくてクラスに対して呼び出すメソッドよ。def self.countみたいな定義をするわ」


ヨハネ「さて、長くなってきたから一旦切ろうかしら。クラスに関してはまだあるから、次回もヨハネが引き続きやるわね」
マル「うーん、さすがに内容盛りだくさんなんだな」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です