Rubyをちょっと理解しよう
UniStudy#1 @ シェアハウスコクリエ
Unicast Inc. Web Engineer          
疋田 駿
発表するひと
http://qiita.com/shunhikita
https://twitter.com/shunhikita
株式会社ユニキャスト セールスエンジニア
▷ 2015年入社の田舎暮らし新卒文系Webエンジニア(23
歳・経営学部卒)
▷ Ruby, Ruby on Rails, PHP, AngularJS, C#, Android
▷ Microservicesなサービス作り希望
話すこと
▷ オープンクラスとモンキーパッチ
▷ メソッドを呼び出すと何が起きる?
▷ Rubyにおけるselfキーワード
※私もRuby勉強中です。
オープンクラス
- リファクタリングをする場面 -
def to_alphanumeric(s)
s.gsub(/[^ws]/, ‘’)
end
全ての句読点や特殊文字を削除してアルファベットとス
ペースを残すようなもの
なんかオブエジェクト指向っぽくないですね。
sのオブジェクトがgsubメソッド持ってなかったら
… NoMethodError !!
“
外部メソッドに文字列オブジェクトを渡して
変換してもらうんじゃなくて、文字列自身に
変換してもらったほうがいいんじゃない?
“
でも、文字列って標準のStringクラスだし
AlphanumericStringみたいなクラスを作るの?
オープンクラスを使おう!
オープンクラス
- リファクタリングをする場面 -
class String
def to_alphanumeric
gsub(/[^ws]/, ‘’)
end
end
Stringクラスをオープン
してメソッドを追加。
Rubyでは1度定義したクラスをオープンして
好きなメソッドを追加できる。
“***UniStydy#1 ***”.to_alphanumeric
# => UniStudy1
実際にやってみる
クラスCを定義して
x メソッドを定義する
クラスCをオープンして
y メソッドを定義する
オブジェクトを作成してxを呼
ぶ。
yメソッドも呼んでみる
ちなみに...
Rubyではインスタンス変数
は値が代入されたときに初め
て出現します。
オブジェクトのクラスと
インスタンス変数につながり
はない
クラスとオブジェクトの関係
▷ オブジェクトにはインスタンス変数とクラスへの参照が
あるだけ
▷ クラスとインスタンス変数に繋がりはない
▷ メソッドはオブジェクトが持っているのではなくクラスが持ってい
る。
obj
@v = 1
MyClass
my_method()
クラス
メソッドインスタンス変数
オブジェクト クラス
オープンクラスの問題点
▷ 既存のメソッドを上書きできること
▷ 他のプログラムに影響を与えてしまう場合がある
=> このようなコードをモンキーパッチと呼ぶ
しっかりと管理でき、意図してモンキーパッチを
使うのであればよいが、それ以外は使わない方が
無難。
Refinementsという解決策
=> 今日はやりません
メソッドを呼び出すと何が起こる?
1. メソッドを探す
2. メソッドを実行する。
このプロセスは全てのオブジェクト指向で起きている。
メソッド探索
メソッドがレシーバのクラスに入り、
メソッドを見つけるまで継承チェーンを遡ること。
obj MySubClass
MyClass
my_method()
Object
Kernel
BasicObject
my_method()
発見!
継承チェーンにはモ
ジュールも含まれま
す
includeとprepend
include ・・・インクルードしたクラスの上に挿入される
prepend・・・インクルードしたクラスの下に挿入される
メソッドの実行
このメソッドを実行するにはRubyは2つの
ことを知らなければならない
1
@x が属しているオブジェクトはな
に?
2
my_other_methodが呼び出され
ているオブジェクトはなに?
=> どちらもレシーバに属している。
Rubyはメソッドが呼び出された時にレシーバの参照を
覚えておく必要がある。 => selfキーワード
selfキーワード
Rubyのコードには常にselfの役割を担う、カレントオブジェクトという
オブジェクトの参照を持っている。
▷ メソッドを呼び出すと、レシーバがselfになる
▷ レシーバを明示せずにメソッドを呼び出すと、selfに対するメ
ソッド呼び出しになる
▷ インスタンス変数は常にselfのインスタンス変数とみなされる
Rubyの達人になりたければ常にselfを意識してプログラミングせよ。
とのことです。
my_methodを呼び出した時
点でselfはobjの参照を持つ
▷ @xはselfの参照objのインスタンス変数を使用する
▷ my_other_methodも同様にobjのメソッドを呼び出すと理解
できる
じゃあ見てみよう
クラス、モジュール定義とself
▷ クラスやモジュール定義の内側(メソッドの外側)ではselfはク
ラスやモジュールそのものになる。
class MyClass
self # => MyClass
end
Rubyはすべてのインスタンス変数はselfに属するものと思ってい
る。
selfはMyClass
そのもの
selfはレシーバ
になる
クラスインスタンス変数と
インスタンス変数は別物!
間違えるな!
つまり、
クラスインスタンス変数@xはMyClassというClassクラスの
オブジェクトのインスタンス変数である。
一応補足 : クラスを紐解くと...
▷ MyClassというクラスはClassクラスのオブジェクト
▷ MyClassという名前はただの定数
MyClass = Class.new do
def my_method; “my_method”; end
end
class MyClass
def my_method; “my_method”; end
end
こう書き換えることも出来る
そんなとこで今日はおしまいです。
次回予告
Rubyのメタプログラミングに入門しよう

Rubyをちょっと理解しよう