Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Rubyをちょっと理解しよう

660 views

Published on

社内勉強会 UniStudy #1 の発表資料です。
Rubyについてちょっと話ました。

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Rubyをちょっと理解しよう

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

×