第8回セントラルソフトRuby研究会

1,738 views

Published on

若手による社内勉強会の資料です。

  • Be the first to comment

  • Be the first to like this

第8回セントラルソフトRuby研究会

  1. 1. システム1部 システム開発課 奥山 洋平
  2. 2. Ruby Gold の合格者に好評な本この本は「コードを記述するためのコードを記述する」ための技術を学ぶ本本日の内容はこの本の第1章
  3. 3. 内容◦ 第1部 メタプログラミングRuby  第1章 オブジェクトモデル 本日はココ  第2章 メソッド  第3章 ブロック  第4章 クラス定義  第5章 コードを記述するコード◦ 第2部 Railsにおけるメタプログラミング  第7章 ActiveRecordの設計  第8章 ActiveRecordの中身  第9章 安全なメタプログラミング◦ 第3部 付録
  4. 4. オブジェクト :実際の処理対象のデータインスタンス変数 :オブジェクトが持つ値インスタンスメソッド :オブジェクトに実行させる処理クラス :オブジェクトの設計図クラス変数 :クラスが持つ値クラスメソッド :クラスに実行させる処理
  5. 5. 車オブジェクト1 クラス classインスタンス変数 ガソリン残量:10ℓ class クラス変数 生産コスト:100万円オブジェクト2 クラスメソッド 車の生産 インスタンスメソッド 走る ガソリン残量:20ℓ オブジェクトが「走る」を実行するとき は これを参照する
  6. 6. クラスが持つメソッドなどを他のクラスに引き継がせること全てのクラスはObjectクラスを継承する例 クラス 車 クラス superclass クラス 車体の色:黒 車体の色:白
  7. 7. クラスのスーパークラスを順にたどって、行きつくまでのパスがクラスの「継承チェーン」クラスメソッド「ancestors」を呼び出すと分かる 全てのクラスはObjectクラスを継承するので は? そもそもKernelはモジュールでは? Kernel例 MyClass class superclass def myMethod Object puts "myMethod“ end superclass end MyClass myMethod class MySubClass < MyClass end superclass class obj = MySubClass.new obj MySubClass
  8. 8. モジュールで定義した定数やメソッドをクラス(include)やオブジェクト(extend)で使うことができる例:カーナビ include:車に初めから搭載 extend:後から買って取り付け
  9. 9. クラスにモジュールをincludeするとき、Rubyは無名クラスでモジュールをラップして、継承チェーンのincludeするクラスの真上に挿入する module M1 Kernel end module M2 Object end class C クラスCの真上に挿入 include M1 M1 M2 include M2 end C
  10. 10. オブジェクトのメソッドを実行◦ オブジェクトはメソッドを持たないので、継承チェーン を順に 探し、見つかったら実行例 Kernel class MyClass def myMethod superclass puts "myMethod“ Object end 発見 end superclass myMethod MyClass class MySubClass < MyClass 実行 myMethod end 無い superclass obj = MySubClass.new class obj MySubClass obj.myMethod
  11. 11. 次のプログラムの出力結果は? module M1 class Cl def print include M1 "Module1" include M2 end end end module M2 obj = Cl.new def print puts obj.print "Module2" end end
  12. 12. 次のプログラムの出力結果は? module M1 class Cl def print include M1 "Module1" include M2 end end end module M2 obj = Cl.new def print puts obj.print "Module2" end end 答え Module2
  13. 13. オブジェクトobjの継承チェーンは以下のようになる Kernel ここまで探索しない Object ここでprintメソッ ドが見つかる M1 ⇒実行 print M2 print obj Cl
  14. 14. 今のプログラムで“Module1”を出力させるには? module M1 class Cl def print include M1 "Module1" include M2 end end end module M2 obj = Cl.new def print puts obj.print "Module2" end end
  15. 15. 今のプログラムで“Module1”を出力させるには? module M1 class Cl def print include M1 "Module1" include M2 end end end module M2 obj = Cl.new def print puts obj.print "Module2" end end 答え includeを入れ替える
  16. 16. 話の流れ的に途中に入れにくかった内容
  17. 17. Rubyの定数は大文字で始める定数はファイルシステムのように並ぶ◦ パスを指定して任意の定数を取り出すことができる 絶対パス ::MyModule::MyClass::MyConstant例 module MyModule MyModule MyConstant = “A” MyClass class MyClass MyConstant “B” MyConstant = “B” end MyConstant “A” end 絶対パス ::MyModule::MyConstant
  18. 18. クラス名などが競合する場合、モジュールに入れ、「モジュール名::クラス名」という形で競合を回避できるこのように、クラスや定数をまとめるだけのモジュールをネームスペースという module M1 class Cl例 class Cl def print def print "Class" end "M1::Class" end end end c1 = M1::Cl.new end puts c1.print M1::Class c2 = Cl.new puts c2.print Class

×