Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rubyのオブジェクトモデル
Search
mayuko hirono
October 22, 2016
Programming
0
1.2k
Rubyのオブジェクトモデル
mayuko hirono
October 22, 2016
Tweet
Share
Other Decks in Programming
See All in Programming
「ちょっと古いから」って避けてた技術書、今だからこそ読もう
mottyzzz
11
7k
ALL CODE BASE ARE BELONG TO STUDY
uzulla
27
6.6k
Software Architecture
hschwentner
6
2.3k
開発組織の戦略的な役割と 設計スキル向上の効果
masuda220
PRO
5
460
All About Angular's New Signal Forms
manfredsteyer
PRO
0
200
ソフトウェア設計の実践的な考え方
masuda220
PRO
4
630
Server Side Kotlin Meetup vol.16: 内部動作を理解して ハイパフォーマンスなサーバサイド Kotlin アプリケーションを書こう
ternbusty
3
230
SwiftDataを使って10万件のデータを読み書きする
akidon0000
0
230
Claude Agent SDK を使ってみよう
hyshu
0
1.3k
Developer Joy - The New Paradigm
hollycummins
1
340
NixOS + Kubernetesで構築する自宅サーバーのすべて
ichi_h3
0
1.1k
デミカツ切り抜きで面倒くさいことはPythonにやらせよう
aokswork3
0
260
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Building Flexible Design Systems
yeseniaperezcruz
329
39k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Java REST API Framework Comparison - PWX 2021
mraible
34
8.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
22k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
630
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.1k
Transcript
Hello Ruby! Rubyのオブジェクトモデルについて
オブジェクトモデルって? プログラムを構成するクラスやモジュール、メソッドなどの言語要素の関係を示すもの。 Rubyはオブジェクト指向なので、オブジェクトモデル (言語要素の関係)を理解すると、Rubyが分かった気になれ たり、何ができるか想像しやすくなったりします。
Rubyってこんな言語! • クラスもモジュールもメソッドも定数もすべてが第一級オブジェクト。 (変数に代入したり、引数として渡した り、返り値として渡したりできる。第一級関数とかいう表現もある。 ) • 変数に型がなく、事前に宣言が要らない。処理も入る。 (高階関数) •
標準クラスのメソッドを書き換えられる。 • 実行時にオブジェクトの性質を参照・変更できる。(イントロスペクションて呼ばれます) • シンタックスシュガー多い • ポリモーフィズム(多態性) • 他にもあるかもm(__)m
オブジェクトモデルの理解には時間がかかります。 今日は、皆さんがRubyって不思議だなと思った時に、役立ちそうなものを紹介します!
記法ルール(あとで見てください) Constant_variable => 定数は大文字から始まる。 MyClass => クラス名は大文字から始まる。クラス定義は、名前がクラス名の定数にクラスオブジェクトを代入すること。 @instance_variable @@class_variable local_variable
$global_variable MyClass.class_method MyClass#instance_method #=> 使うときはドットでメッセージを送る。
オブジェクトモデルを理解するための便利ライブラリ(gem) $gem install pry irb(Interactive ruby shell)の改良版みたいなもの irbは標準入力からRubyの式を入力するとすぐに評価してくれる実行環境 (対話型実行環境とかREPL(Read-Eval-Print Loop)とか呼ばれます)
$gem install pry-doc Rubyドキュメントとソースコード(C)をpry上で見せてくれます
pry-docを使ってみましょう > show-doc Object#class > show-source Object#class
クラスとインスタンスの作り方
オブジェクトモデルを理解するための便利メソッド Module#ancestors クラスが継承したクラスとインクルードしたモジュールをリストにして返す Module#instance_methods クラスやモジュールで定義されているインスタンスメソッドの名前を集めて配列にして返す Kernel#methods オブジェクトが持つメソッドを返す、親クラスやインクルードしたモジュールのメソッドも含む Class#superclass クラスの親クラスを返す Object#class
オブジェクトのクラスを返す
早速、Module#ancestorsを使ってみましょう! Module#ancestorsは、あるクラスが継承したクラスと、 インクルードしたモジュールのリストを返します。 MyClassクラス, Stringクラス, Integerクラスで試します。
MyClass.ancestors
String.ancestors
Integer.ancestors
全ての結果に Objectクラス Kernelモジュール BasicObjectクラス が含まれます。 [ [ [
つまり、MyClass/String/Integerクラスは Objectクラス Kernelモジュール BasicObjectクラス が持つメソッドを使うことができます。 Rubyでは、ほとんどのオブジェクトが、 上の2つのクラスと1つのモジュールのメソッドを持ちます。
Objectクラスって何? もう皆さんは、Objectクラスが何かを知るための道具を持っています。 Rubyでは、Objectクラスもオブジェクトであり、何かのクラスのインスタンスです。 何クラスのインスタンスでしょうか? Object.class #=> Class(Classという名前のクラスがある ) このクラスのスーパークラスは何でしょうか? Object.superclass
#=> BasicObject どんなメソッドを持っているでしょうか? Object.methods #=> ???
Rubyで定義されているクラスは 全てClassクラスのインスタンスです。 Classクラスにclassメソッドを渡すと 何が返るでしょうか? Classクラスは何クラスのインスタンスでしょうか? Class.class #=> ???
Classクラスのインスタンスです 自己参照しています。ややこしいですね
図に描いてみましょう(やっぱりややこしいですね)
Rubyのオブジェクトモデルが理解できると • メソッドを動的に追加・再定義する Module#define_method • 呼びたいメソッドをコード実行時に決める Object#send などの仕組みが理解しやすくなります。 私もまだまだ勉強中です。 もし興味を持って頂けたら、ぜひ調べてみてくださいm(__)m
そして教えてください♪