Vol.4 ~クラス~
○ インスタンス変数
ひとつのオブジェクトに複数の情報/データを持つための入れ物
例)
オブジェクト 「本」
インスタンス変数 「タイトル」、「著者名」、「ISBN(管理コード)」
○ インスタンス変数の定義
インスタンス変数の定義はインスタンスの領域に行う。
クラスに変数と同名のインスタンスを定義して、その中に 「@」 をつけて定義する。
これは外部からデータを取得するメソッドで、一般に getter と呼ばれる
続いて、データ設定用のメソッド (setter) を定義する。
メソッド名はインスタンス変数名に等号「=」をつける
例) Book クラスを定義して、各情報のインスタンス変数を定義する
class Book
# getter
def author # 著者
@author
end
def title #タイトル
@title
end
def isbn # ISBN
@isbn
end
# setter
def author=(author)
@author = author
end
def title=(title)
@title = title
end
def isbn=(isbn)
@isbn = isbn
end
end
○ attr_accessor
インスタンス変数の操作には、変数の数だけの getter / setter が必要だが、atter_accessor を使用すれば、1行で済ませることが可能。
class BOOK
atter_accessor :author, :title, :isbn
end
「:」以降の部分を「シンボル」といい、Symbol クラスのインスタンスである。
>> :author.class
=> Symbol
例)外部ファイル book.rb を読み込み、インスタンス変数に値を設定する。
>> require 'book' # 外部ファイルの読み込み(拡張子不要)
=> true
>> book = Book.new # インスタンス生成
=> #<Book:0x34c5588>
>> book.author = "Hal Edwin Fulton" # 値の設定
=> "Hal Edwin Fulton"
>> book.title = "The Ruby Way" # 値の設定
=> "The Ruby Way"
>> book.author # 値の取得
=> "Hal Edwin Fulton"
>> book.title # 値の取得
=> "The Ruby Way"
○ インスタンスの初期化 ~initialize~
初期化用メソッド 「initialize」 を使えば、インスタンス生成時点にあらかじめデータを設定することが可能。
class Book
attr_accessor :author, :title, :isbn
def initialize(author, title)
@author = author
@title = title
end
end
メソッド 「initialize」 はインスタンスを生成するためのメソッド「new」の引数を使用して間接的に呼び出される
>> load 'book.rb' # 外部ファイルの再読み込み(拡張子が必要)
=> true
>> book = Book.new("Hal Edwin Fulton","The Ruby Way")
=> #<Book:0x2e79990 @title="The Ruby Way", @author="Hal Edwin Fulton">
○ 名前空間とモジュール
パッケージ :
Java などで利用される手法のひとつ。以下のような利点がある
●同じ役割のクラス・インターフェースを1つのパッケージのまとめることでそのクラス・インターフェースの持つ意味がわかりやすくなる
●同じ名前のクラス・インターフェースが複数ある場合、名前の衝突を避けることができる
●パッケージをしようすることで、クラス・メンバ変数・メソッドコンストラクタにアクセス制限をつけることができる
Ruby ではパッケージという概念が無いので、モジュールやクラスを入れ子に配置して名前空間を形成する。
例) Foo という名前空間にある Bar をいうクラスは、Foo モジュールの中に定義する
module Foo
class Bar
end
end
定義した Bar クラスを参照するには、 Foo::Bar のように、名前空間を 「::」 で区切ってあらわす。
クラス 「Foo::Bar」 のソースコードは、「foo」 フォルダ内に 「bar.rb」 という名前で配置/存在する。
ファイル名やディレクトリ名は全て小文字で表記する。
Ruby では、あるクラスが複数のクラスを継承(多重継承)することはできないが、複数のモジュールなら同時に利用可能(Mix-in)。
class クラス名
include モジュール名
end