Rubyのオブジェクトモデル
by
mayuko hirono
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Hello Ruby! Rubyのオブジェクトモデルについて
Slide 2
Slide 2 text
オブジェクトモデルって? プログラムを構成するクラスやモジュール、メソッドなどの言語要素の関係を示すもの。 Rubyはオブジェクト指向なので、オブジェクトモデル (言語要素の関係)を理解すると、Rubyが分かった気になれ たり、何ができるか想像しやすくなったりします。
Slide 3
Slide 3 text
Rubyってこんな言語! ● クラスもモジュールもメソッドも定数もすべてが第一級オブジェクト。 (変数に代入したり、引数として渡した り、返り値として渡したりできる。第一級関数とかいう表現もある。 ) ● 変数に型がなく、事前に宣言が要らない。処理も入る。 (高階関数) ● 標準クラスのメソッドを書き換えられる。 ● 実行時にオブジェクトの性質を参照・変更できる。(イントロスペクションて呼ばれます) ● シンタックスシュガー多い ● ポリモーフィズム(多態性) ● 他にもあるかもm(__)m
Slide 4
Slide 4 text
オブジェクトモデルの理解には時間がかかります。 今日は、皆さんがRubyって不思議だなと思った時に、役立ちそうなものを紹介します!
Slide 5
Slide 5 text
記法ルール(あとで見てください) Constant_variable => 定数は大文字から始まる。 MyClass => クラス名は大文字から始まる。クラス定義は、名前がクラス名の定数にクラスオブジェクトを代入すること。 @instance_variable @@class_variable local_variable $global_variable MyClass.class_method MyClass#instance_method #=> 使うときはドットでメッセージを送る。
Slide 6
Slide 6 text
オブジェクトモデルを理解するための便利ライブラリ(gem) $gem install pry irb(Interactive ruby shell)の改良版みたいなもの irbは標準入力からRubyの式を入力するとすぐに評価してくれる実行環境 (対話型実行環境とかREPL(Read-Eval-Print Loop)とか呼ばれます) $gem install pry-doc Rubyドキュメントとソースコード(C)をpry上で見せてくれます
Slide 7
Slide 7 text
pry-docを使ってみましょう > show-doc Object#class > show-source Object#class
Slide 8
Slide 8 text
クラスとインスタンスの作り方
Slide 9
Slide 9 text
オブジェクトモデルを理解するための便利メソッド Module#ancestors クラスが継承したクラスとインクルードしたモジュールをリストにして返す Module#instance_methods クラスやモジュールで定義されているインスタンスメソッドの名前を集めて配列にして返す Kernel#methods オブジェクトが持つメソッドを返す、親クラスやインクルードしたモジュールのメソッドも含む Class#superclass クラスの親クラスを返す Object#class オブジェクトのクラスを返す
Slide 10
Slide 10 text
早速、Module#ancestorsを使ってみましょう! Module#ancestorsは、あるクラスが継承したクラスと、 インクルードしたモジュールのリストを返します。 MyClassクラス, Stringクラス, Integerクラスで試します。
Slide 11
Slide 11 text
MyClass.ancestors
Slide 12
Slide 12 text
String.ancestors
Slide 13
Slide 13 text
Integer.ancestors
Slide 14
Slide 14 text
全ての結果に Objectクラス Kernelモジュール BasicObjectクラス が含まれます。 [ [ [
Slide 15
Slide 15 text
つまり、MyClass/String/Integerクラスは Objectクラス Kernelモジュール BasicObjectクラス が持つメソッドを使うことができます。 Rubyでは、ほとんどのオブジェクトが、 上の2つのクラスと1つのモジュールのメソッドを持ちます。
Slide 16
Slide 16 text
Objectクラスって何? もう皆さんは、Objectクラスが何かを知るための道具を持っています。 Rubyでは、Objectクラスもオブジェクトであり、何かのクラスのインスタンスです。 何クラスのインスタンスでしょうか? Object.class #=> Class(Classという名前のクラスがある ) このクラスのスーパークラスは何でしょうか? Object.superclass #=> BasicObject どんなメソッドを持っているでしょうか? Object.methods #=> ???
Slide 17
Slide 17 text
Rubyで定義されているクラスは 全てClassクラスのインスタンスです。 Classクラスにclassメソッドを渡すと 何が返るでしょうか? Classクラスは何クラスのインスタンスでしょうか? Class.class #=> ???
Slide 18
Slide 18 text
Classクラスのインスタンスです 自己参照しています。ややこしいですね
Slide 19
Slide 19 text
図に描いてみましょう(やっぱりややこしいですね)
Slide 20
Slide 20 text
Rubyのオブジェクトモデルが理解できると ● メソッドを動的に追加・再定義する Module#define_method ● 呼びたいメソッドをコード実行時に決める Object#send などの仕組みが理解しやすくなります。 私もまだまだ勉強中です。 もし興味を持って頂けたら、ぜひ調べてみてくださいm(__)m そして教えてください♪