ରࡦ
• ૉͳΞϓϩʔν(࠶ఆٛͰϑϥάΛཱͯΔ)
• Fixnum.method_addedΛϢʔβ͕ఆٛͯ͠
͍Δ߹ͳͲʹӨڹ͕ग़Δ
class Fixnum
alias eq_orig ==
def ==(other)
eq_orig(other)
end
alias == eq_orig
end
Slide 9
Slide 9 text
ରࡦ
• ࠾༻ͨ͠Ξϓϩʔν(࠶ఆٛҎ֎ͰϑϥάΛཱͯΔ)
• ՄࢹੑΛ໌ࣔతʹઃఆ͢Δ(Ruby 2.0ʙ2.2)
• refine͢Δ(Ruby 2.0ʙ2.3dev)
class Fixnum
public :==
end
module M
refine Fixnum do
def ==; end
end
end
Slide 10
Slide 10 text
ଓɾ
• C.new == C.newͷ==ϝιουݺͼग़͠ͷΠ
ϕϯτ͕र͑ͳ͍
trace = TracePoint.new(:return, :c_return) {|tp|
p tp.method_id
}
class C; end
trace.enable {
C.new == C.new
}
ଓɾରࡦ
• ૉͳΞϓϩʔν
• ϝιουΛ࠶ఆٛͯ͠ݩʹ͞ͳ͍
• BasicObject.method_added(ུ)
• ϞϯΩʔύον͕ద༻͞Εͨঢ়ଶͰϢʔβίʔυ͕࣮ߦ͞
Εͯ͠·͏
class BasicObject
alias eq_orig ==
def ==(other); eq_orig(other); end
alias == eq_orig
end
Slide 13
Slide 13 text
ଓɾରࡦ
• ࠾༻ͨ͠Ξϓϩʔν
• refine͢Δ(refine͞Ε͍ͯΔ͜ͱΛࣔ͢ಛघͳϝιου
ΤϯτϦΛrb_obj_equalͷલʹૠೖ͢Δ)
• ͲͪΒͷΞϓϩʔνͰRubyͷඪ४Ϋϥεʹ͍ͭͯࣄલʹ
ରԠ͓ͯ͘͜͠ͱ͕Մೳ͕ͩɺC֦ுͰ࡞ͨ͠Ϣʔβఆٛ
Ϋϥε·Ͱٹ͑ͳ͍ͱ͍͏՝Δ
module M
refine BasicObject do
def ==; end
end
end
Slide 14
Slide 14 text
ଓʑɾ
• C.new == C.newͷ==ϝιουݺͼग़͠ͷΠ
ϕϯτ͕1ճ͔͠र͑ͳ͍
trace = TracePoint.new(:return, :c_return) {|tp|
p tp.method_id
}
class C; end
trace.enable {
loop {
C.new == C.new
}
}
Slide 15
Slide 15 text
ଓʑɾݪҼ
• 1ճͷݺͼग़࣌͠ʹʮ࠷ऴతʹrb_obj_equalΛݺͿʯ
ͱ͍͏ใΛΠϯϥΠϯΩϟογϡʹ࣋ͬͯ͠·͏ͨΊ
Lightweight Method Dispatch on MRI(Koichi Sasada)͔ΒҾ༻