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 そして教えてください♪