
Rubyはオブジェクト指向言語です。そのため、クラスの仕様、作成方法を熟知することで、自由にクラス設計を行い、プログラムを組み立てることができます。また第三者の書いたRubyコードの思考をくみ取ることもできます。ここではRubyのクラス作成方法について、全体像をまとめていきます。
クラスを作成する
ここではクラスの作成方法を知り、基本的なオブジェクトの生成、利用を行えるようになることを目指します。
ここで話すこと:
- クラス定義
- クラスでのメソッド定義
- コンストラクタ(インスタンスの初期化)
- アクセサ(ゲッター/セッター)
- クラス内の定数
クラス定義
Rubyでクラスを作成するには、classキーワードで以下のように定義します。
class MyClass contents... end
- MyClass: クラス名
インスタンスのメソッド
class MyClass def my_method process... end end
- my_method: メソッド名
class User
# インスタンスメソッド
def greet
p "Hello."
end
end
# インスタンス生成
user = User.new
# メソッド呼出し
user.greet #=> "Hello."
クラスの特異メソッド
クラスメソッドを定義するにはメソッド宣言のレシーバに self キーワードを使います。Rubyのクラスメソッドは、特異メソッドの1つとして機能します。
class MyClass def self.my_method process... end end
- my_method: メソッド名
クラス内でメソッドのレシーバに self を指定することで、インスタンス化せずにクラスのメソッドを利用することができます。
class User
# クラスメソッド(特異メソッド)
def self.greet
p "Hello."
end
end
# メソッド呼出し
User.greet #=> "Hello."
インスタンスの生成/初期化
class MyClass def initialize(arg) @ins = arg end end
- @ins: インスタンス変数
- arg: 引数
MyClass.new(arg1, arg2)
- @ins: インスタンス変数
- arg: 引数
class User
# コンストラクタ
def initialize(name, age)
@name = name
@age = age
end
def greet
p "I'm #{@name}, #{@age} years old."
end
end
# インスタンス生成
user = User.new # =>: ArgumentError
# wrong number of arguments (given 0, expected 2)
user = User.new("Kanye", 22)
# メソッド呼出し
user.greet #=> "I'm Kanye, 22 years old."
class MyClass CONST_VALUE = 2.236920679 end
- CONST_VALUE: 定数名
クラス定数には :: 演算子でアクセスします。
MyClass::CONST_VALUE
- MyClass: クラス名
- CONST_VALUE: 定数名
class Router
LOCALHOST_IP = "127.0.0.1"
end
p Router::LOCALHOST_IP #=> "127.0.0.1"
アクセサ
他言語ではセッターやゲッターとも呼ばれるアクセサですが、Rubyでは専用の書き方が用意されています(もちろん、自分でアクセサメソッドを定義してもかまいませんがRubyとしての可読性は低くなります)。attr_accessorにインスタンス変数の名前を渡す。それだけでアクセサが自動的に定義されます。
class MyClass attr_accessor :ins end
- MyClass: クラス名
class User
attr_accessor :name
end
user = User.new
user.name = "Kanye"
p user.name #=> "Kanye"
class MyClass attr_writer :ins end
- MyClass: クラス名
class MyClass attr_reader :ins end
- MyClass: クラス名
class User
attr_writer :name
attr_reader :name
end
user = User.new
user.name = "Kanye"
p user.name #=> "Kanye"