Ruby2.0 Getting Started

3,050 views

Published on

Ruby2.0の新機能やパフォーマンスなどの変更点をまとめました。

Published in: Technology

Ruby2.0 Getting Started

  1. 1. Ruby2.0 Getting Started Ruby2.0をはじめよう!
  2. 2. • Ruby2.0について• 新機能紹介• 非互換性• パフォーマンスAgenda
  3. 3. About Ruby2.0 Ruby2.0についてAbout Ruby2.0
  4. 4. • 2013年2月24日にリリース( Ruby20歳の誕生日! )• Ruby1.9との高い互換性• 数多くの新機能• パフォーマンスの向上• 2.0.0は「安定版」リリース• 「Rubyは言語として2.0でほぼ完成」by matzAbout Ruby2.0
  5. 5. Future 新機能紹介Future
  6. 6. • キーワード引数• Enumerable#lazy• Module#prepend• シンボルリストリテラル• Refinments• その他Future
  7. 7. Keyword Arguments キーワード引数Keyword Arguments Future
  8. 8. ~1.9でも実現可能def hello(options = {}) # デフォルト値を適用 options = {name: "guest"}.merge(options) puts "Hello #{options[:name]}!!"endhello #=> Hello guest!!hello(name: "taro") #=> Hello taro!!Keyword Arguments Future
  9. 9. 2.0ではこうなるdef hello(name: "guest") puts "Hello #{name}!!"endhello #=> Hello guest!!hello(name: "taro") #=> Hello taro!!Keyword Arguments Future
  10. 10. シンプルに書けるようになった!# Ruby1.9def hello(options = {}) options = {name: "guest"}.merge(options) puts "Hello #{options[:name]}!!"end# Ruby2.0def hello(name: "guest") puts "Hello #{name}!!"endKeyword Arguments Future
  11. 11. 引数の存在チェックもしてくれるdef hello(name: "guest") puts "Hello #{name}!!"endhello(nama: "jiro") #=> ArgumentError: unknown keyword: namaKeyword Arguments Future
  12. 12. **で残りのHashを受け取れるdef hello(name: "guest", **options) msg = "Hello #{name}!!" msg.upcase! if options[:upcase] puts msgendhello(name: "hanako") #=> Hello hanako!!hello(name: "hanako", upcase: true) #=> HELLO HANAKO!!Keyword Arguments Future
  13. 13. 最後の引数がHashのメソッドは注意def foo(somehash, option: 1) # do something...end# 引数の最後がHashの場合、キーワードだと判断されるhash_arg = {name: "guest"}foo(hash_arg) #=> ArgumentError: unknown keyword: name# オプションとして空のHashを指定することで回避可能foo(hash_arg, {})Keyword Arguments Future
  14. 14. 積極的に使うべき!!• オプションパラメータを受けるメソッドがシンプル に実装できる• 引数の存在チェックもしてくれる• 引数の最後にHashを受ける場合は使わないKeyword Arguments Future
  15. 15. Enumerable#lazy 遅延評価イテレータEnumerable#lazy Future
  16. 16. Enumerable#lazyって?• 遅延評価を行うEnumeratorを返すメソッド• 遅延評価=必要とされるまで評価(実行)しない• selectやmapの利用範囲が広がる• 巨大なリストの処理が省メモリにEnumerable#lazy Future
  17. 17. 1~1億の奇数を5個取り出してみる# lazy不使用:なかなか結果が返ってこない(1..100000000).select{|num| num.odd?}.take(5)#=> [1, 3, 5, 7, 9]# lazy使用:すぐに結果が返ってくる(1..100000000).lazy.select{|num| num.odd?}.take(5).force#=> [1, 3, 5, 7, 9]Enumerable#lazy Future
  18. 18. Enumerable#lazyの使い道• IO・Range・巨大な配列を省メモリに処理• 無限リストでselectやmapを使う• Railsアプリでは使い所は少ないかも• 続きはWEBで http://www.techscore.com/tech/Ruby/ruby-2.0/lazy/Enumerable#lazy Future
  19. 19. Module#prepend モジュールによるオーバーライドModule#prepend Future
  20. 20. Module#prependって?• Module#includeの親戚• includeは自クラスと親クラスの間にモジュールを 挿入• prependは自クラスの手前にモジュールを追加• 対象クラスのメソッドをオーバーライド可能にModule#prepend Future
  21. 21. prependとincludeの比較 - 1module IM def hoge; puts "IM#hoge"; endendmodule PM def hoge; puts "PM#hoge"; super; endendclass C include IM prepend PM def hoge; puts " C#hoge"; super; endendModule#prepend Future
  22. 22. prependとincludeの比較 - 2# ancestorsで継承階層を表示するC.ancestors #=> [PM, C, IM, Object, Kernel, BasicObject]obj = C.newobj.hoge# PM#hoge# C#hoge# IM#hogeModule#prepend Future
  23. 23. Module#prependの使い道• 構造化された再利用可能なモンキーパッチ• alias_method_chain(ActiveSupport)の撲滅• RailsやActiveRecordなど、既存のライブラリを拡 張するライブラリを制作する時に便利!Module#prepend Future
  24. 24. Symbol list literal シンボルリストリテラルSymbol list literal Future
  25. 25. %i %I でシンボルの配列に。便利!!# 普通に配列リテラルで書く[:hoge, :fuga, :piyo] #=>[:hoge, :fuga, :piyo]# %wしてmapする%w(hoge fuga piyo).map(&:intern) #=>[:hoge, :fuga, :piyo]# シンボルリストリテラル - %i (式展開なし)%i(hoge fuga piyo) #=>[:hoge, :fuga, :piyo]# シンボルリストリテラル - %I (式展開あり)%I(a#{1+1} a#{1+2}) #=>[:a2, :a3]Symbol list literal Future
  26. 26. Refinements 局所的なメソッド再定義Refinements Future
  27. 27. Refinementsって?• 局所的に特定のクラスのメソッドを変更する仕組• Ruby2.0の目玉機能になる筈だった• 例)ActiveRecord+Refinments# gem activerecord-refinements# 以下はUser.where(name: "matz")と同じUser.where{:name == "matz"}Refinements Future
  28. 28. しかし…• 残念ながら大幅に機能削減された挙句、 experimental(実験的)機能になってしまった• 本来の想定どおりに実装されるとDSLの可能性 が大きく広がる• 2013年クリスマス頃に予定されているRuby2.1に 大いに期待!!Refinements Future
  29. 29. Others その他の新機能Others Future
  30. 30. • デフォルトの文字コードがUTF-8に (マジックコメントが不要になる)• __dir__メソッド (実行中ファイルのディレクトリパス)• to_hメソッド( Hashへの型変換)• Enumerable#size(遅延サイズ評価)• 正規表現エンジンの変更(鬼車 → 鬼雲)• TracePointやDtraceによるデバッグ機能の強化Others Future
  31. 31. Incompatibility 非互換性Incompatibility
  32. 32. 1.9 ~ 2.0の非互換性• iconvの削除(Ruby1.9で既に非推奨)• IO#lines, #chars, #codepoints, #bytesが Enumeratorではなく配列を返すようになった• Object#inspect が#to_s を呼び出さなくなった• デフォルトのエンコーディングがUTF-8に• ABI互換性がなくなった (1.9の.soや.bundleを共用してはいけない)Incompatibility
  33. 33. Performance パフォーマンスPerformance
  34. 34. 最適化によるパフォーマンス向上• bitmap marking による GC 最適化• メソッドディスパッチなどの VM 最適化• 浮動小数演算の最適化• Kernel#require の最適化Performance
  35. 35. ベンチマーク1 - 浮動小数点演算require benchmarkputs RUBY_VERSIONputs Benchmark::CAPTIONputs Benchmark.measure {100000000.times{|i| 1.0 * i}} user system total real1.8.7 | 2.040000 0.000000 2.040000 ( 2.086681)1.9.3 | 1.120000 0.000000 1.120000 ( 1.161166)2.0.0 | 0.720000 0.000000 0.720000 ( 0.724945)Performance
  36. 36. ベンチマーク2 – Rails起動速度time RAILS_ENV=production rails runner "" user system real1.9.3 | 0m4.104s 0m0.356s 0m4.620s2.0.0 | 0m2.154s 0m0.365s 0m2.594sPerformance
  37. 37. Conclusion まとめConclusion
  38. 38. Ruby2.0の魅力• 魅力的な新機能 • キーワード引数・lazy・prependなど• 1.9との高い互換性 • 殆どのコードが変更なしで動作する• パフォーマンスの向上 • 処理速度の向上 • Railsの起動速度大幅に向上Conclusion

×