[Ruby]クラスの書き方

0
431
views

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"