クラス/メソッド定義
- クラスはリオープンして再定義する事が可能(以後他へ影響する)
- クラスは特異クラスとして一時的に独自の定義が可能(他へ影響しない)
- メソッドは特異メソッドとして一時的に独自定義が可能(他へ影響しない)
- 親クラスを同時に二つ定義し継承することはできないが、代りにmoduleがある
- moduleはMix-in
- moduleからインスタンス変数へアクセス可能
- 特異クラスからincludeする場合 extend メソッド利用可能
- 標準親クラスのメソッドを子で定義してオーバーライド可能(例:method_missing)
- aliasでメソッド名別名定義が可能
- aliasで別名定義し元のメソッド名をundefし定義を消す事も可能
class.rb
# class
class Hoge
def initialize(a)
@a = a
p "call Hoge.initialize @a --> #{@a}"
end
def method_hoge(a)
p "call Hoge.method_hoge @a --> #{@a} a --> #{a}"
@a + a
end
end
# 派生クラス
class HogeExt < Hoge
def initialize(a, b)
p "call HogeExt.initialize a --> #{a}"
super a
@a = a + b
@b = -1
end
def method_ext(a)
p "call HogeExt.method_ext @a --> #{@a}"
@a + a
end
def method_hoge(a)
@a = @a + a
p "call HogeExt.method_hoge #{@a}"
super a
end
def method_missing(m, *args)
p "NoMethodError フック成功!"
super
end
alias ext method_ext # 別名にして
undef method_ext # 大本を消してみる
end
# module
module CommonHoge
def common_method(a)
# moduleからインスタンス変数がアクセス可能
p "call module CommonHoge.common_hoge @b --> #{@b}"
a * 100
end
end
module CommonHoge2
def common_method2(a)
# moduleからインスタンス変数がアクセス可能
p "call module CommonHoge2.common_hoge @b --> #{@b}"
@b * a
end
end
# リオープンclass
class Hoge
include CommonHoge
def method_hage(a)
p "hage!"
end
end
work = Hoge.new(1)
p work.method_hoge(2)
p Hoge.ancestors
p Hoge.instance_methods(false)
p work.instance_variables
p work.common_method(10) # --> 1000
def work.test(a)
p "TOKUI METHOD!"
@a * 10 + 5
end
p work.test(5)
work = HogeExt.new(1, 2)
p work.method_hoge(2)
p HogeExt.ancestors
p HogeExt.instance_methods(false)
p work.instance_variables
work.method_hage(10) # --> 呼び出し可能
p work.common_method(10)
#p work.test(5) # --> NoMethodError
def work.test(a)
p "TOKUI METHOD2!"
@a * 10 + 5
end
p work.test(5) # --> 55
# extendを利用しない書き方
class << work
include CommonHoge2
end
p work.common_method2(25)
work = HogeExt.new(3, 5)
# extendを利用した書き方
work.extend(CommonHoge2)
p work.common_method2(25)
p work.ext(2) # --> alias側はコールできる
p work.method_ext(2) # --> NoMethodError
結果
"call Hoge.initialize @a --> 1"
"call Hoge.method_hoge @a --> 1 a --> 2"
3
[Hoge, CommonHoge, Object, Kernel, BasicObject]
[:method_hoge, :method_hage]
[:@a]
"call module CommonHoge.common_hoge @b --> "
1000
"TOKUI METHOD!"
15
"call HogeExt.initialize a --> 1"
"call Hoge.initialize @a --> 1"
"call HogeExt.method_hoge 5"
"call Hoge.method_hoge @a --> 5 a --> 2"
7
[HogeExt, Hoge, CommonHoge, Object, Kernel, BasicObject]
[:method_hoge, :method_missing, :ext]
[:@a, :@b]
"hage!"
"call module CommonHoge.common_hoge @b --> -1"
1000
"TOKUI METHOD2!"
55
"call module CommonHoge2.common_hoge @b --> -1"
-25
"call HogeExt.initialize a --> 3"
"call Hoge.initialize @a --> 3"
"call module CommonHoge2.common_hoge @b --> -1"
-25
"call HogeExt.method_ext @a --> 8"
10
"NoMethodError フック成功!"
class.rb:35:in `method_missing': undefined method `method_ext' for #<HogeExt:0x007f9b24059968 @a=8, @b=-1> (NoMethodError)
from class.rb:110:in `<main>'