【Ruby】クラスについて
クラス
クラスを定義したい時は、class を使います。
クラス名は英大文字で始まります。
文法
class クラス名
end
rescue/ensure 節を指定し、例外処理ができます。
class MyClass
end
オブジェクトの生成
new 演算子でオブジェクトを生成します。
obj = MyClass.new
クラスメソッド
クラスオブジェクトから実行できるメソッドです。
class クラス名
def self.メソッド名(引数1, 引数2, …)
処理
end
end
※self はクラス名でも可
class Hoge
def self.hoge
puts "hoge"
end
end
クラス変数
変数名の前に「@@」をつけて定義する。
そのクラスの全てのインスタンスで共有される変数。
クラスメソッド、インスタンスメソッド、クラス定義式内でアクセスできます。
インスタンスメソッド
インスタンスオブジェクトから実行できるメソッドです。
class クラス名
def メソッド名(引数1, 引数2, …)
処理
end
end
class Hoge
def hoge
puts "hoge"
end
end
インスタンス変数
変数名の前に「@」をつけて定義する。
インスタンスごとに独立して持つ変数。
インスタンス変数にアクセスできるのは、initializeメソッドとオブジェクトのインスタンスメソッドだけ
class クラス名
def メソッド名
@name = 値
end
end
initializeメソッド
オブジェクトの初期化のためのメソッドです。
クラス内に記述した場合にはオブジェクトが作成される時に自動的に呼び出されます。
class クラス名
def initialize()
処理
end
end
※Javaなどで言う所のコンストラクタみたいなものですかね。
アクセスメソッド
クラスの中で使われているインスタンス変数は、
参照したり変更したい場合は、インスタンスメソッドを経由して行う必要があります。
しかし、多くのインスタンス変数がある場合はメソッドの管理などが面倒です。
そこで参照や更新が簡易的に行えるアクセスメソッドと呼ばれるものが用意されています。
用意されているアクセスメソッドは次の3つです。
定義式 | 機能 |
---|---|
attr_reader :変数名 | 参照が可能 |
attr_writer :変数名 | 更新が可能 |
attr_accessor :変数名 | 参照と更新が可能 |
使い方は次のようになります。
class Human
def initialize(name="未定義")
@name = name
end
attr_accessor :name
end
上記のように対象となるインスタンス変数名に対して、
「attr_reader」「attr_writer」「attr_accessor」のいずれかを使って、
上記のように記述することで、参照や更新用のメソッドを個別に定義する代わりとなります。
継承
クラスを継承したい時は、< を使います。
class MyClass
end
class MySuperClass < MyClass
end
スーパークラスを省略した場合は、Object クラスのサブクラスとして作成されます。
クラスのネスト
クラスをネスト(入れ子)にすることができます。
外側クラスと内側クラスに継承関係はありません。
class AAA
class BBB
end
end
obj = AAA::BBB.new
クラスの拡張
すでに作成済みのクラスに対して、メソッドや変数などを追加(上書き)することができます。
class MyClass # クラスを定義
def name
puts "Yamada"
end
end
class MyClass # 同盟のクラスを定義
def name # 既存のメソッドを上書き
puts "Yamada Taro"
end
def city # 既存クラスにメソッドを追加
puts "Tokyo"
end
end
特異クラス
特定のオブジェクトにメソッドやインスタンス変数を 定義/追加します。
この構文の内部で定義したメソッドや定数は指定したオブジェクトに対してだけ有効になります。
文法
class << expr
式..
end
rescue/ensure 節を指定し、例外処理ができます。
obj = Object.new # obj = nil でも可
class << obj
def test
:
end
:
end
特異メソッド
Rubyでは、特定のオブジェクトにのみ有効なオブジェクト固有のメソッドを定義できます。
文法
def {オブジェクト}.{メソッド名}~end
{オブジェクト}を省略した場合は、「self」に対するメソッド定義となります。
モジュール
モジュール名はアルファベットの大文字で始めます。
モジュールではオブジェクトを作成することは出来ません。
モジュールの利用方法としては、
「モジュール名.メソッド名」の形式で関数のように実行するか、
または他のクラスの中にインクルードして利用することが出来ます。
文法
module モジュール名
式..
end
rescue/ensure 節を指定し、例外処理ができます。
module Foo # Fooモジュールを定義
def add(x, y)
return x + y
end
end
class Bar
include Foo # Fooモジュールを取り込む
end
obj = Bar.new # Barのインスタンスであっても
puts obj.add(3, 5) # Fooモジュールのメソッドadd()を利用できる