$30 off During Our Annual Pro Sale. View Details »

Search and Destroy in Ruby

wtnabe
September 28, 2013

Search and Destroy in Ruby

大ヒット連ドラ、あまちゃんの「見つけてこわそう」をヒントにRubyでこれを表現してみました。

Kanazawa.rb meetup #13 用のスライドでしたが、出席できなかったので @Yukimitsu_Izawa さんに喋ってもらいました。なんと、出席した人が誰もネタ知らなかったw

wtnabe

September 28, 2013
Tweet

More Decks by wtnabe

Other Decks in Programming

Transcript

  1. ⾒つけてこわそう
    Search and Destroy ( or Seek and Destroy ) in Ruby
    @wtnabe
    Kanazawa.rb meetup #13
    2013-09-28 (Sat) at ITプラザ武蔵

    View Slide

  2. お品書き
    ⾒つける
    壊す
    逆回転

    View Slide

  3. 今回壊すもの
    Rubyのオブジェクト
    Rubyのメソッド

    View Slide

  4. 1. ⾒つける

    View Slide

  5. RubyのClass
    RubyのClassは実は「Classオブジェクト
    のインスタンス」を「定数にバインドし
    ている」だけ
    定数はObject.constantsで⾒つかる
    Object.constantsはSymbolのArrayなの
    でちょっと加⼯して判定する

    View Slide

  6. こう
    Object.constants.sort.map {|e|
    Object.const_get(e.to_s)
    }.select {|e|
    e.class == Class
    }
    [ArgumentError, Array, BasicObject, Bignum, Binding, Class,
    Complex, ...

    View Slide

  7. ポイント
    Rubyはすべてオブジェクト
    クラスはClassオブジェクトのインスタン

    オブジェクトのクラスは.classメソッドで
    分かる
    ObjectやModuleに便利メソッドがあるよ

    View Slide

  8. あれ?
    実際にはrequireしていないものは出⼒さ
    れない
    例外もClassだけど、例外は例外だけで⾒
    たいね

    View Slide

  9. OK, 宿題にします

    View Slide

  10. 2. 壊す

    View Slide

  11. Classを壊す
    require 'date'
    Date.today.to_s # => '2013-09-28'
    Date = nil
    Date.today # => NoMethodError: undefined metho

    View Slide

  12. 3. 逆回転

    View Slide

  13. ……

    View Slide

  14. 無理です><

    View Slide

  15. 直せるようにしておく
    require 'date'
    d = Date
    Date = nil
    Date.today # => NoMethodError: undefined metho
    Date = d
    Date.today.to_s # => '2013-09-28'

    View Slide

  16. オブジェクトを壊す
    RubyのClassはオープンクラス
    カジュアルに再オープンして変更します

    View Slide

  17. ⾒つける
    Stringはみんな知ってるのでそれで
    とりあえず簡単なdowncaseメソッドで

    View Slide

  18. 壊す
    s = 'ABC'
    s.downcase # => 'abc'
    s.instance_eval {
    def downcase
    ''
    end
    }
    s.downcase # => ''

    View Slide

  19. これでは直せません><

    View Slide

  20. メソッドの⾒つけ⽅
    Object.methods.sort.grep(/RE/)
    .private_methods...
    .instance_methods...

    View Slide

  21. メソッド操作メソッド
    Module.private_methods.sort.
    grep(/method/)
    # => [:__method__, :alias_method,
    :define_method, :method_added,
    :method_missing, :method_removed,
    ...]
    これらは通常 class 式の中で使います

    View Slide

  22. 壊すメソッド
    remove_method
    undef_method

    View Slide

  23. 直せるようにしておく
    alias_method

    View Slide

  24. 壊す
    s = 'ABC'
    s.downcase # => 'abc'
    s.instance_eval {
    class << self
    alias_method :downcase_org, :downcase
    undef_method :downcase
    end
    }
    s.downcase # => NoMethodError: undefined metho

    View Slide

  25. 逆回転
    s.instance_eval {
    class << self
    alias_method :downcase, :downcase_org
    undef_method :downcase_org
    end
    }
    s.downcase # => 'abc'

    View Slide

  26. ここでまた疑問

    View Slide

  27. 壊しまくったら?
    BlankSlate オブジェクト
    1.9以降のBasicObjectがこれに近い

    View Slide

  28. 既存のメソッドの動作に
    ちょっとアレンジ
    単に消したいことってほとんどない
    それ alias_method_chain で
    要 ActiveSupport

    View Slide

  29. まとめ
    Rubyはオブジェクトとメソッドがカギ
    クラスも特別なものではない
    Rubyのクラスはオープンクラス
    メソッドを操作するメソッドがあるよ

    View Slide

  30. ⾒つけてこわそう

    View Slide

  31. That's all folks !

    View Slide