Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Rubyのメソッド探索
今回使うメソッド 
ハンズオン 
# インスタンスのクラスを取得 
<インスタンス>.class 
! 
# 継承ツリーを取得 
<クラス>.ancestors 
! 
# メソッドのオーナーを取得 
<インスタンス>.method(:<メソッ...
右に一歩いって、上へ
クラスはメソッドの置き場所
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 
insta...
class FirstClass 
def hanako 
“tarou” 
end 
end 
instance FirstClass 
instance2 
モンキーパッチで 
クラスのメソッド書き換える 
instance.hanako ...
自分のクラスにメソッドが 
見つからなければ 
継承元を探索  
Sub 
継承 
class Super 
def hanako 
“super” 
end 
end 
! 
class Sub < Super 
end Sub.new.ha...
MixInも継承ツリーに 
差し込まれる  
MyClass 
module Mix 
def hanako 
“mix” 
end 
end 
! 
class Mixed 
include Mix 
end 
Mix-In 
Mixed.n...
module Mix1 
def hanako 
“1” 
end 
end 
! 
module Mix2 
def hanako 
“2” 
end 
end 
! 
class Mixed2 
include Mix1 
include ...
includeはincludeされる 
クラスのすぐ上に差し込む 
Mix2の方が後によばれるので 
Mix2のメソッドが呼ばれる 
Mixed2 
module Mix1 
def hanako 
“1” 
end 
end 
! 
modu...
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 
“o...
BasicObject 
Kernel 
MyClass 
class Super 
def hanako 
end 
end 
! 
module Mix 
def hanako 
end 
end 
! 
class Sub < Super...
Ruby 2.0 ~ 
BasicObject 
Kernel 
Mix 
Prepend 
module Mix 
def hanako 
log.info ( “call #{__method__}” ) 
super 
end 
end ...
クラス自体も 
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.h...
Class Classに足してみる 
class Class 
def hanako 
"Class#hanako" 
end 
end 
! 
class MyClass; end 
無関係のクラスにまで 
(°д°lll) 
MyClass...
オブジェクト固有の 
メソッドを置く場所が必要!
特異クラス 
val = “a” 
def val.hanako 
“#{self} hanako” 
end 
! 
val.hanako #=> “a hanako” 
“a”.hanako #=> No Method Error 
Bas...
Classもオブジェクト
クラスも特異クラスがある 
BasicObject 
Kernel 
class MyClass; end 
! 
def MyClass.hanako 
“hanako” 
end 
MyClass.hanako Object 
Class ...
class ~ endまでのselfはクラス自身なので 
self.メソッドに書き換えれる 
BasicObject 
Kernel 
class MyClass 
def self.hanako 
end 
end 
MyClass.hana...
クラスメソッドは実現できた 
だがまだ不十分
Superクラスの 
クラスメソッド継承したい! 
(°д°)
クラスの特異クラスのスーパークラスは 
クラス自身のスーパークラスの特異クラス 
#BasicObject 
#Object 
Object 
class Super 
def self.hanako 
end 
end 
! 
class S...
特異クラスをたどり終わると 
クラスの探索に戻る 
new をSuperでとめてみようModule 
#BasicObject Class 
#Object 
Object 
class Super 
def self.new 
end 
en...
include 
と 
extend
includeはクラスの継承ツリーに差し込まれる 
BasicObject 
module Mix 
end 
! 
Kernel 
class MyClass 
include Mix 
end Object 
MyClass 
#<MyCl...
extendはクラスの特異クラスの 
継承ツリーに差し込まれる 
module Mix 
def hanako 
end 
end 
! 
class MyClass 
extend Mix 
end 
MyClass#<Class 
Obje...
右に一歩いって、上へ 
(オブジェクトは 
自分のクラスから 
継承ツリーを上にたどる)
ご清聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

Rubyメソッド探索

Ruby メタプロ講座一回目

  • Be the first to comment

Rubyメソッド探索

  1. 1. Rubyのメソッド探索
  2. 2. 今回使うメソッド ハンズオン # インスタンスのクラスを取得 <インスタンス>.class ! # 継承ツリーを取得 <クラス>.ancestors ! # メソッドのオーナーを取得 <インスタンス>.method(:<メソッド名>).owner
  3. 3. 右に一歩いって、上へ
  4. 4. クラスはメソッドの置き場所
  5. 5. instance FirstClass class FirstClass def hanako end end instance = FirstClass.new instance.hanako インスタンスは 自分のクラスにメソッドを 探索しにいく
  6. 6. class FirstClass def hanako end end クラスは インスタンス間で共通 instance FirstClass instance2 instance = FirstClass.new instance.hanako ! instance2 = FirstClass.new instance2.hanako
  7. 7. class FirstClass def hanako “tarou” end end instance FirstClass instance2 モンキーパッチで クラスのメソッド書き換える instance.hanako instance2.hanako
  8. 8. 自分のクラスにメソッドが 見つからなければ 継承元を探索  Sub 継承 class Super def hanako “super” end end ! class Sub < Super end Sub.new.hanako #<Sub> Super
  9. 9. MixInも継承ツリーに 差し込まれる  MyClass module Mix def hanako “mix” end end ! class Mixed include Mix end Mix-In Mixed.new.hanako #<Mixed> Mix
  10. 10. 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
  11. 11. 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
  12. 12. Blank class Blank end Blank.new.to_s #<Blank> ownerを確かめよう!
  13. 13. BasicObject Kernel Blank class Blank end スーパークラスを指定 されなかったクラスは暗黙的に Objectクラスを継承する Blank.new.to_s Object #<Blank>
  14. 14. モンキーパッチで to_sメソッドの探索を 途中で止めてみよう! BasicObject Kernel モンキーパッチsuper Blank class Blank end class Object def to_s “obj: [#{super}]” end end Blank.new.to_s Object #<Blank>
  15. 15. 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
  16. 16. 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
  17. 17. クラス自体も Classクラスの インスタンス
  18. 18. classキーワードを使った クラス定義はClass.newに置き換えられる class NewClass end NewClass = Class.new NewClassという定数に Classクラスのインスタンスを 代入しているだけ
  19. 19. newはClassクラスのメソッド BasicObject Kernel Class class MyClass end MyClass.new Object MyClass#<Class> Module
  20. 20. インスタンスのメソッドの 置き場所がクラスのように ! クラスのメソッドの 置き場所はClassクラス
  21. 21. えっ(°д°) RSS.parse 見たいなクラス特有の クラスメソッド どうするの?
  22. 22. Class Classに足してみる class Class def hanako "Class#hanako" end end ! class MyClass; end MyClass.hanako # => String.hanako # => ためしてみよう!
  23. 23. Class Classに足してみる class Class def hanako "Class#hanako" end end ! class MyClass; end 無関係のクラスにまで (°д°lll) MyClass.hanako # => "Class#hanako" String.hanako
  24. 24. オブジェクト固有の メソッドを置く場所が必要!
  25. 25. 特異クラス val = “a” def val.hanako “#{self} hanako” end ! val.hanako #=> “a hanako” “a”.hanako #=> No Method Error BasicObject Kernel Object #Instance Comparable #<String String
  26. 26. Classもオブジェクト
  27. 27. クラスも特異クラスがある BasicObject Kernel class MyClass; end ! def MyClass.hanako “hanako” end MyClass.hanako Object Class MyClass#<Class> Module #MyClass
  28. 28. class ~ endまでのselfはクラス自身なので self.メソッドに書き換えれる BasicObject Kernel class MyClass def self.hanako end end MyClass.hanako Object Class MyClass#<Class> Module #MyClass
  29. 29. クラスメソッドは実現できた だがまだ不十分
  30. 30. Superクラスの クラスメソッド継承したい! (°д°)
  31. 31. クラスの特異クラスのスーパークラスは クラス自身のスーパークラスの特異クラス #BasicObject #Object Object class Super def self.hanako end end ! class Sub < Super end Sub#<Class> BasicObject #Sub Super #Super
  32. 32. 特異クラスをたどり終わると クラスの探索に戻る new をSuperでとめてみようModule #BasicObject Class #Object Object class Super def self.new end end ! class Sub end Sub#<Class> BasicObject #Sub Super #Super
  33. 33. include と extend
  34. 34. includeはクラスの継承ツリーに差し込まれる BasicObject module Mix end ! Kernel class MyClass include Mix end Object MyClass #<MyClass Mix
  35. 35. extendはクラスの特異クラスの 継承ツリーに差し込まれる module Mix def hanako end end ! class MyClass extend Mix end MyClass#<Class Object #Object #MyClass #Mix
  36. 36. 右に一歩いって、上へ (オブジェクトは 自分のクラスから 継承ツリーを上にたどる)
  37. 37. ご清聴ありがとうございました

    Be the first to comment

    Login to see the comments

  • hondamfb

    Aug. 29, 2014
  • takpr

    Aug. 29, 2014

Ruby メタプロ講座一回目

Views

Total views

1,232

On Slideshare

0

From embeds

0

Number of embeds

34

Actions

Downloads

4

Shares

0

Comments

0

Likes

2

×