Help us understand the problem. What is going on with this article?

Ruby クラスの基礎知識まとめ

More than 5 years have passed since last update.

書籍「パーフェクトRuby」のクラスの章から気になった部分をまとめます。

インスタンスの生成/初期化

class MyClass
  def initialize
    puts 'Init'
  end
end

my_instance = MyClass.new # 'Init' と表示

インスタンスメソッド

定義の仕方

class MyClass
  def method_a
    puts 'method_a'
  end
  def method_b
    method_a
      # インスタンスメソッド内のレシーバは
      # selfのため同じインスタンスのメソッドを
      # 呼び出すときは省略可
  end
end

my_instance = MyClass.new
my_instance.method_a # 'method_a'と表示
my_instance.method_b # 'method_a'と表示

インスタンスメソッド名の慣習

~? : 真偽値を返すメソッドに付けられることが多い
~! : 破壊的なメソッドや処理に失敗した際に偽を返す、例外を発生させるメソッドがある場合の例外を発生させる方につけることが多い

インスタンス変数へのアクセス

メソッドで定義する場合

  • 代入を行うためのメソッド (@hogeに対して)
    • MyClass#hoge=
  • 参照するためのメソッド
    • MyClass#hoge

→ attr_~を使えば省略可

class MyClass
  attr_accessor :hoge, :fuga # 可変長引数なので複数定義可
end

クラスメソッド

定義の仕方

class MyClass
  # 1
  def self.class_method_a
    puts "self.class_method_a" 
  end
  # 2 特異クラス定義 と呼ばれるやり方
  class << self
    def class_method_b
      puts "class_method_b" 
    end
    def class_method_c
      puts "class_method_c" 
    end
  end
end

クラスメソッド内ではMyClass.newの"MyClass"を省略できる
→ self = クラス自身を指す

class MyClass
  class << self
    def pair_init
      [new, new]
    end
    def trio_init
      [new, new, new]
    end
  end
end

メソッドの呼び出し制限

割愛
protectedはほぼ使わないでしょうとのこと

クラスの継承

単一継承のみサポート
スーパークラスの指定の仕方

class SuperMyClass
end

class MyClass < SuperMyClass
end

スーパークラスを指定していない場合は「Objectクラス」が自動的に継承される

サブクラス

サブクラスはスーパークラスのインスタンスメソッド、クラスメソッドは継承するがインスタンス変数の情報が持たない。
ただ、インスタンスメソッド内で定義されているものは結果的に引き継ぐことになる。
また定数も引き継ぎます。サブクラスで定数を定義した場合は上書きされる。
freezeした場合も上書きされる。

class SuperMyClass
  def initialize
    @superVar = 'init'
  end
end

class MyClass < SuperMyClass
end

SuperMyClass.new #=> #<SupurMyClass:12345 @superVar='init'>
MyClass.new #=> #<MyClass:67889 @superVar='init'>

メソッドのオーバーライド

スーパークラスにあるメソッドと同名のメソッドをサブクラスで再定義すること | パーフェクトRuby P124
メソッドの引数や呼び出し制限はサブクラスでの定義で上書きされる。

メソッドの中でsuperするとスーパークラスの同名のメソッドを呼ぶことができる

class MyClass < SuperMyClass
  def greet(name)
    super # 自動的に引数が渡される
    puts 'sub class greet'
  end
end

特異メソッド

クラスに定義されたメソッドとは他に定義することができる

class MyClass
end

foo = MyClass.new
boo = MyClass.new

def bar.singleton_method

同名のメソッドをオーバーライドすることもできる

クラス変数とそのスコープ

割愛
そのクラスとサブクラス以外からは参照ができない。

クラス定義のネスト

クラスの中にクラスが定義できる

class MyClass
  class SweetMyClass
  end
end

My.new
My::SweetMyClass.new

# すでにMyClasが定義されていたら
class MyClass::SweetMyClass
end

ネストした定数の参照

ネストしたクラスモジュール内では定数の参照は自クラス・モジュール → ネストが低い位置の定数を参照していく。

参考

lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away