クラスに関する前2記事「【Ruby入門】クラスとオブジェクト」「【Ruby入門】クラスの継承、オーバーライド 」を読んでいただいた方々は、なんとなく釈然としないはずです。
それもそのはず、ソースコードが一切出てきていないからです。
コードを実際に見ないと、プログラマ的に納得できないですよね。
よって本記事では、今まで学習してきたことをソースコードにしてみます。
前2記事と本記事を行ったり来たりして、理解を深めてくださいね!
クラスの基本形 def 〜 end
ではまず、クラスの基本形からいきましょう。
以下のとおりです。
class クラス名 # 処理の中身 end
これ以降、今までさんざん出てきたBookクラスを順に作っていきましょう。
まずはBookクラスの枠組みを作ります。
class Book end
コンストラクタとインスタンスメソッド
コンストラクタとインスタンスメソッドを作りましょう。
前記事では変数はたくさん出てきましたが、本のタイトルと著者だけに省略します。
class Book # コンストラクタ (initializeメソッド) def initialize(mytitle = "", myauthor = "") @title = mytitle @author = myauthor end # インスタンスメソッド def display puts "title = " + @title + " ; author = " + @author end end
(実行しても何も返ってきません。)
Rubyでは、インスタンス直後に自動的に呼ばれるメソッドを、initializeメソッドといいます。前記事でコンストラクタとして解説したものと同じです。
インスタンス変数は@で始まります。
mytitle = “” と myauthor = “” は、インスタンス化のときに引数を受け取り、それをインスタンス変数に格納する記述です。しかし何も受け取らなければ空文字を入れるという意味になります。
インスタンスメソッドdisplayを追加してみました。インスタンス化したあとに呼び出せるメソッドです。後ほど解説します
アクセサメソッド
インスタンスの外部からインスタンス内部の変数へ直接アクセスせず、アクセサメソッド経由でアクセスするのが一般的です。
よって、アクセサメソッドを追加してみましょう。
class Book # コンストラクタ (initializeメソッド) def initialize(mytitle = "", myauthor = "") @title = mytitle @author = myauthor end # ゲッターメソッド def title @title end #セッターメソッド def author(value) @author = value end # インスタンスメソッド def display puts "title = " + @title + " ; author = " + @author end end
もちろんこれでもよいのですが、もう少しスマートに書きましょう。
class Book # アクセサメソッド attr_accessor :title attr_accessor :author # コンストラクタ (initializeメソッド) def initialize(mytitle = "", myauthor = "") @title = mytitle @author = myauthor end # インスタンスメソッド def display puts "title = " + @title + " ; author = " + @author end end
attr_accessorメソッドを使いました。
アクセサメソッドの種類は以下のとおりです。仕様に応じて適切なものを選んでください。
- attr_reader 参照のみ可
- attr_writer 変更のみ可
- attr_accessor 参照と変更の両方可
クラスメソッド、定数
クラスメソッドは、クラスそのものに紐づくメソッドです。インスタンスとは無関係です。
class << クラス名 # 処理 end
早速使いましょう。何回インスタンス化されたかを管理する変数countを定義します。
頭に@を2つ付けて変数名を書くと、クラス変数の定義になります。
class Book @@count = 0 class << count puts "count = " + @@count end # アクセサメソッド attr_accessor :title attr_accessor :author # コンストラクタ (initializeメソッド) def initialize(mytitle = "", myauthor = "") @title = mytitle @author = myauthor @@count += 1 end # インスタンスメソッド def display puts "title = " + @title + " ; author = " + @author end end
クラスメソッド定義の部分「class << count」は、以下のように書くことも可能です。
def self.count puts "count = " + @@count end
クラス変数は、外からもアクセスできます。このように宣言します。
class Book Summary = "Book class" # 以下省略 end
呼び出すときは以下のとおりです。コロンを2つつなげます。
class Book # 省略 end p Book::Summary
[実行結果]
"Book class"
メソッドのアクセス修飾子を定義する
メソッドによっては他からアクセスさせてはいけないものがあります。
Bookクラスでいうと、インスタンス変数を初期化するメソッドなどです。
そのようなメソッドは、他から呼ばれないようにprivateにしましょう。
class Book # 中略 private def val_init @title = 0 @author = "" end end
privateを書いた以降に定義したメソッドは、すべてprivateになります。
特定のメソッドだけprivate指定したい場合は、以下のようにします。
class Book # 中略 def val_init @title = 0 @author = "" end private :val_init end
ここまでの完成形
今までの内容でできたクラスの完成形は以下のとおりです。じっくりご覧ください。
class Book Summary = "Book class" @@count = 0 class << self puts "count = " + @@count.to_s end # アクセサメソッド attr_accessor :title attr_accessor :author # コンストラクタ (initializeメソッド) def initialize(mytitle = "", myauthor = "") @title = mytitle @author = myauthor @@count += 1 end # インスタンスメソッド def display puts "title = " + @title + " ; author = " + @author end # 非公開 (プライベートメソッド) private def val_init @title = 0 @author = "" end end
まとめ
本記事では、Rubyのクラスの基本を解説しました。
ここまで来るのは大変だったでしょう?お疲れさまでした!
ただ、残念ながら大切な話はまだ続きます。
もう少しお付き合いください!