Search and Destroy in Ruby

088b1b43ff5dd64aa0f000da9e9da777?s=47 wtnabe
September 28, 2013

Search and Destroy in Ruby

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

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

088b1b43ff5dd64aa0f000da9e9da777?s=128

wtnabe

September 28, 2013
Tweet

Transcript

  1. ⾒つけてこわそう Search and Destroy ( or Seek and Destroy )

    in Ruby @wtnabe Kanazawa.rb meetup #13 2013-09-28 (Sat) at ITプラザ武蔵
  2. お品書き ⾒つける 壊す 逆回転

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

  4. 1. ⾒つける

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

  6. こう Object.constants.sort.map {|e| Object.const_get(e.to_s) }.select {|e| e.class == Class }

    [ArgumentError, Array, BasicObject, Bignum, Binding, Class, Complex, ...
  7. ポイント Rubyはすべてオブジェクト クラスはClassオブジェクトのインスタン ス オブジェクトのクラスは.classメソッドで 分かる ObjectやModuleに便利メソッドがあるよ

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

  9. OK, 宿題にします

  10. 2. 壊す

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

    Date.today # => NoMethodError: undefined metho
  12. 3. 逆回転

  13. ……

  14. 無理です><

  15. 直せるようにしておく require 'date' d = Date Date = nil Date.today

    # => NoMethodError: undefined metho Date = d Date.today.to_s # => '2013-09-28'
  16. オブジェクトを壊す RubyのClassはオープンクラス カジュアルに再オープンして変更します

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

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

    def downcase '' end } s.downcase # => ''
  19. これでは直せません><

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

  21. メソッド操作メソッド Module.private_methods.sort. grep(/method/) # => [:__method__, :alias_method, :define_method, :method_added, :method_missing,

    :method_removed, ...] これらは通常 class 式の中で使います
  22. 壊すメソッド remove_method undef_method

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

  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
  25. 逆回転 s.instance_eval { class << self alias_method :downcase, :downcase_org undef_method

    :downcase_org end } s.downcase # => 'abc'
  26. ここでまた疑問

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

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

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

  30. ⾒つけてこわそう

  31. That's all folks !