SlideShare a Scribd company logo
Rubyのメソッド探索
今回使うメソッド 
ハンズオン 
# インスタンスのクラスを取得 
<インスタンス>.class 
! 
# 継承ツリーを取得 
<クラス>.ancestors 
! 
# メソッドのオーナーを取得 
<インスタンス>.method(:<メソッド名>).owner
右に一歩いって、上へ
クラスはメソッドの置き場所
instance FirstClass 
class FirstClass 
def hanako 
end 
end 
instance = FirstClass.new 
instance.hanako 
インスタンスは 
自分のクラスにメソッドを 
探索しにいく
class FirstClass 
def hanako 
end 
end 
クラスは 
インスタンス間で共通 
instance FirstClass 
instance2 
instance = FirstClass.new 
instance.hanako 
! 
instance2 = FirstClass.new 
instance2.hanako
class FirstClass 
def hanako 
“tarou” 
end 
end 
instance FirstClass 
instance2 
モンキーパッチで 
クラスのメソッド書き換える 
instance.hanako 
instance2.hanako
自分のクラスにメソッドが 
見つからなければ 
継承元を探索  
Sub 
継承 
class Super 
def hanako 
“super” 
end 
end 
! 
class Sub < Super 
end Sub.new.hanako 
#<Sub> 
Super
MixInも継承ツリーに 
差し込まれる  
MyClass 
module Mix 
def hanako 
“mix” 
end 
end 
! 
class Mixed 
include Mix 
end 
Mix-In 
Mixed.new.hanako 
#<Mixed> 
Mix
module Mix1 
def hanako 
“1” 
end 
end 
! 
module Mix2 
def hanako 
“2” 
end 
end 
! 
class Mixed2 
include Mix1 
include Mix2 
end 
どうなるかためしてみよう! 
継承ツリーをみてみよう! 
Mix-In × 2 
Mixed2.new.hanako
includeはincludeされる 
クラスのすぐ上に差し込む 
Mix2の方が後によばれるので 
Mix2のメソッドが呼ばれる 
Mixed2 
module Mix1 
def hanako 
“1” 
end 
end 
! 
module Mix2 
def hanako 
“2” 
end 
end 
! 
class Mixed2 
include Mix1 
include Mix2 
end 
Mix-In × 2 
Mixed2.new.hanako 
#<Mixed2> 
Mix1 
Mix2
Blank 
class Blank 
end 
Blank.new.to_s 
#<Blank> 
ownerを確かめよう!
BasicObject 
Kernel 
Blank 
class Blank 
end 
スーパークラスを指定 
されなかったクラスは暗黙的に 
Objectクラスを継承する 
Blank.new.to_s Object 
#<Blank>
モンキーパッチで 
to_sメソッドの探索を 
途中で止めてみよう! 
BasicObject 
Kernel 
モンキーパッチsuper 
Blank 
class Blank 
end 
class Object 
def to_s 
“obj: [#{super}]” 
end 
end 
Blank.new.to_s Object 
#<Blank>
BasicObject 
Kernel 
MyClass 
class Super 
def hanako 
end 
end 
! 
module Mix 
def hanako 
end 
end 
! 
class Sub < Super 
include Mix 
end 
継承+MixIn 
MyClass.new.hanako 
Object 
#<MyClass> 
Super 
Mix
Ruby 2.0 ~ 
BasicObject 
Kernel 
Mix 
Prepend 
module Mix 
def hanako 
log.info ( “call #{__method__}” ) 
super 
end 
end 
! 
class MyClass 
prepend Mix 
end 
MyClass.new.hanako 
Object 
#<MyClass> 
MyClass
クラス自体も 
Classクラスの 
インスタンス
classキーワードを使った 
クラス定義はClass.newに置き換えられる 
class NewClass 
end NewClass = Class.new 
NewClassという定数に 
Classクラスのインスタンスを 
代入しているだけ
newはClassクラスのメソッド 
BasicObject 
Kernel 
Class 
class MyClass 
end 
MyClass.new 
Object 
MyClass#<Class> 
Module
インスタンスのメソッドの 
置き場所がクラスのように 
! 
クラスのメソッドの 
置き場所はClassクラス
えっ(°д°) 
RSS.parse 
見たいなクラス特有の 
クラスメソッド 
どうするの?
Class Classに足してみる 
class Class 
def hanako 
"Class#hanako" 
end 
end 
! 
class MyClass; end 
MyClass.hanako # => 
String.hanako # => 
ためしてみよう!
Class Classに足してみる 
class Class 
def hanako 
"Class#hanako" 
end 
end 
! 
class MyClass; end 
無関係のクラスにまで 
(°д°lll) 
MyClass.hanako # => "Class#hanako" 
String.hanako
オブジェクト固有の 
メソッドを置く場所が必要!
特異クラス 
val = “a” 
def val.hanako 
“#{self} hanako” 
end 
! 
val.hanako #=> “a hanako” 
“a”.hanako #=> No Method Error 
BasicObject 
Kernel 
Object 
#Instance 
Comparable 
#<String String
Classもオブジェクト
クラスも特異クラスがある 
BasicObject 
Kernel 
class MyClass; end 
! 
def MyClass.hanako 
“hanako” 
end 
MyClass.hanako Object 
Class 
MyClass#<Class> 
Module 
#MyClass
class ~ endまでのselfはクラス自身なので 
self.メソッドに書き換えれる 
BasicObject 
Kernel 
class MyClass 
def self.hanako 
end 
end 
MyClass.hanako Object 
Class 
MyClass#<Class> 
Module 
#MyClass
クラスメソッドは実現できた 
だがまだ不十分
Superクラスの 
クラスメソッド継承したい! 
(°д°)
クラスの特異クラスのスーパークラスは 
クラス自身のスーパークラスの特異クラス 
#BasicObject 
#Object 
Object 
class Super 
def self.hanako 
end 
end 
! 
class Sub < Super 
end 
Sub#<Class> 
BasicObject 
#Sub 
Super 
#Super
特異クラスをたどり終わると 
クラスの探索に戻る 
new をSuperでとめてみようModule 
#BasicObject Class 
#Object 
Object 
class Super 
def self.new 
end 
end 
! 
class Sub 
end 
Sub#<Class> 
BasicObject 
#Sub 
Super 
#Super
include 
と 
extend
includeはクラスの継承ツリーに差し込まれる 
BasicObject 
module Mix 
end 
! 
Kernel 
class MyClass 
include Mix 
end Object 
MyClass 
#<MyClass 
Mix
extendはクラスの特異クラスの 
継承ツリーに差し込まれる 
module Mix 
def hanako 
end 
end 
! 
class MyClass 
extend Mix 
end 
MyClass#<Class 
Object 
#Object 
#MyClass #Mix
右に一歩いって、上へ 
(オブジェクトは 
自分のクラスから 
継承ツリーを上にたどる)
ご清聴ありがとうございました

More Related Content

PDF
Rubyインスタンス変数
PPTX
Scala勉強会
PPTX
Xtext&Xtend documents
PDF
Macros in Clojure
PDF
値付き Enum 入門、そして伝説へ #yhios #cocoa kansai
PPTX
Javaプログラミング入門【第7回】
PPTX
Javaプログラミング入門【第5回】
PDF
Ruby and ActiveSupport for expart
Rubyインスタンス変数
Scala勉強会
Xtext&Xtend documents
Macros in Clojure
値付き Enum 入門、そして伝説へ #yhios #cocoa kansai
Javaプログラミング入門【第7回】
Javaプログラミング入門【第5回】
Ruby and ActiveSupport for expart
Ad

Rubyメソッド探索