Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ruby-refinements

3925ee6eaa41031bac799de0f4f528ec?s=47 to4iki
September 07, 2014

 ruby-refinements

3925ee6eaa41031bac799de0f4f528ec?s=128

to4iki

September 07, 2014
Tweet

Transcript

  1. Ruby2.1 Refinements Λ৮ͬͯΈͨ Toshiki Takezawa @to4iki

  2. What is Refinements

  3. refinement: ચ࿅, վળ

  4. “ࢦఆͨ͠moduleͷதͰ͚ͩɺ ಛఆͷclassͷmethod Λࠩ͠ସ͑Δػೳ”

  5. open class

  6. Ruby͸StringͳͲͷbuiltin class ΛؚΊطଘͷclass΁methodΛ ௥Ճɾ্ॻ͖͢Δ͜ͱ͕Ͱ͖Δ

  7. class  String      def  hello        

     "#{self}  hello!"      end   end       puts  'hoge'.hello   #=>  'hoge  hello!'   puts  'fuga'.hello     #=>  'fuga  hello!'
  8. Monkey Patch

  9. open classͰطଘͷmethod Λஔ͖׵͑Δ͜ͱ

  10. class  String      def  length        

     5      end          define_method  :to_i,  -­‐>  {  "#{self}  convert  number"  }   end       puts  'a'.length   #=>  5   puts  'javascript'.length   #=>  5   puts  '0'.to_i   #=>  '0  convert  number'   puts  'hoge'.to_i   #=>  'hoge  convert  number'
  11. powerful!! but danger!!

  12. طଘclassΛࢥ͍ͷ··मਖ਼Ͱ͖Δརศੑ ϧʔϧΛഁյͯ͠͠·͏ةݥੑ programશମʹӨڹΛ༩͑ͯ͠·͏ةݥੑ

  13. it is a turn of refinements!

  14. Demo

  15. ex. Ϣʔβ͕࿈ଓͰϩάΠϯ͠ ͍ͯΔ͔Ͳ͏͔Λ஌Γ͍ͨ࣌

  16. module  TimeExtensions      refine  Time  do      

       def  changed_date?              self.beginning_of_day  <  Time.zone.now.beginning_of_day          end      end   end       class  User  <  ActiveRecord::Base      using  TimeExtensions          def  login!          if  self.login_at.changed_date?              #  add  login  bonus          end      end   end
  17. “Ruby͸܅Λ৴པ͢Δɻ Ruby͸܅Λ෼ผͷ͋ΔϓϩάϥϚͱͯ͠ѻ͏ɻ Ruby͸ϝλϓϩάϥϛϯάͷΑ͏ͳڧྗͳྗΛ༩͑Δɻ ͨͩ͠ɺେ͍ͳΔྗʹ͸ɺେ͍ͳΔ੹೚͕൐͏͜ͱΛ๨ Εͯ͸͍͚ͳ͍” -ʮϝλϓϩάϥϛϯάRubyʯংจΑΓ

  18. Thanks.