書籍「パーフェクト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
ネストした定数の参照
ネストしたクラスモジュール内では定数の参照は自クラス・モジュール → ネストが低い位置の定数を参照していく。