Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Ruby 2.5

1 601 vues

Publié le

Ruby 2.5

Publié dans : Technologie
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Ruby 2.5

  1. 1. Ruby 2.5 ながのRubyの会 #1 2017/12/02 とみたまさひろ 1
  2. 2. 自己紹介 とみた まさひろ 長野県北部在住プログラマー 好きなプログラミング言語 Ruby http://tmtms.hatenablog.com http://twitter.com/tmtms 2
  3. 3. Rubyは毎年クリスマスにバージョンアップ 3
  4. 4. Ruby 2.5 2017/12/25 4
  5. 5. Ruby 2.5 新機能&変更 ruby 2.5.0preview1 (2017-10-10 trunk 60153) https://docs.ruby-lang.org/en/trunk/NEWS.html 5
  6. 6. 言語仕様 6
  7. 7. トップレベル定数参照 class Foo end class Bar end # Ruby 2.4 Foo::Bar #=> Bar # Ruby 2.5 Foo::Bar #=> NameError 例外 7
  8. 8. rescue/else/ensure 節 これは従来から簡潔に書けた↓ def foo begin ... rescue ... end end def foo ... rescue ... end 8
  9. 9. 2.5からはdo〜endブロックでも 簡潔に書ける↓ array.each do begin ... rescue ... end end array.each do ... rescue ... end 9
  10. 10. 文字列内式のRefinement class A; def to_s; "a"; end; end module B refine A do def to_s; "b"; end end end class C using B def x A.new.to_s #=> "b" "#{A.new}" #=> "b" 2.4 では "a" end end 10
  11. 11. Unicode バージョン 10.0.0 Ruby 2.4 は 9.0.0 11
  12. 12. 組み込みライブラリ 12
  13. 13. Array#append, #prepend 追加 a = [1, 2, 3] a.append 4 a #=> [1, 2, 3, 4] a.prepend 0 a #=> [0, 1, 2, 3, 4] 13
  14. 14. Dir.children, Dir.each_child 追加 Dir.entries("/tmp/x") #=> ["..", "abc", "."] Dir.children("/tmp/x") #=> ["abc"] Dir.foreach("/tmp/x"){...} # 「.」「..」を含む Dir.each_child("/tmp/x"){...} # 「.」「..」を含まない 14
  15. 15. Dir.glob :base オプション追加 カレントディレクトリの代わりのパスを指定 Dir.glob("/tmp/x/*") #=> ["/tmp/x/abc"] Dir.glob("*", base: "/tmp/x") #=> ["abc"] 15
  16. 16. Hash#transform_keys, transform_keys! 追加 {a: 1, b: 2, c: 3}.transform_keys(&:upcase) #=> {A: 1, B: 2, C: 3} {a: 1, b: 2, c: 3}.transform_values{|v| v*2} #=> {a: 2, b: 4, c: 6} ←これは 2.4 から 16
  17. 17. IO.pread, IO.pwrite 追加 seek & read (write) をアトミックに行う File.open("/tmp/x/abc") do |f| f.read #=> "abcdefghijklmnopqrstuvwxyz" f.pread(10, 3) #=> "defghijklm" end 17
  18. 18. Integer.sqrt 追加 整数の平方根 Integer.sqrt(9) #=> 3 Integer.sqrt(15) #=> 3 Integer.sqrt(16) #=> 4 18
  19. 19. Integer#round, floor, ceil, truncate が整数を返す # Ruby 2.4 123.round(1) #=> 123.0 123.round(-1) #=> 120 # Ruby 2.5 123.round(1) #=> 123 123.round(-1) #=> 120 19
  20. 20. Numeric: coerce内の例外 class A def coerce(other) raise 'hoge' end end # Ruby 2.4 1 < A.new #=> in `<': comparison of Integer with A failed (ArgumentError) # Ruby 2.5 1 < A.new #=> in `coerce': hoge (RuntimeError) 20
  21. 21. Range: <=>内の例外 class A def <=>(x) raise 'hoge' end end # Ruby 2.4 Range.new(A.new, A.new) #=> in `initialize': bad value for range (ArgumentError) # Ruby 2.5 Range.new(A.new, A.new) #=> in `<=>': hoge (RuntimeError) 21
  22. 22. Object#yield_self 追加 # tap は前からある (1.8 ?) 123.tap{|x| x*2} #=> 123 # 2.5 から 123.yield_self{|x| x*2} #=> 246 22
  23. 23. Process.times の精度向上 # Ruby 2.4 % ruby -e 'p Process.times' #<struct Process::Tms utime=0.06, stime=0.01, cutime=0.0, cstime # Ruby 2.5 ruby -e 'p Process.times' #<struct Process::Tms utime=0.071065, stime=0.015792, cutime=0.0, 23
  24. 24. String#delete_prefix, delete_suffix, delete_prefix!, delete_suffix! 追加 "abcdefg".delete_prefix("abc") #=> "defg" "abcdefg".delete_suffix("efg") #=> "abcd" 24
  25. 25. String#casecmp, casecmp? が例 外を発生しない # Ruby 2.4 "hoge".casecmp(123) #=> TypeError # Ruby 2.5 "hoge".casecmp(123) #=> nil 25
  26. 26. String#grapheme_clusters, each_grapheme_cluster 追加 Unicodeの合成文字単位で処理 gaga = "がが" # 1文字目は「か」と「゙」の合成文字 gaga.chars #=> ["か", "゙", "が"] gaga.grapheme_clusters #=> ["が", "が"] 26
  27. 27. Thread#fetch 追加 スレッド固有パラメータの取り出しをHash風に Thread.current[:hoge] #=> nil Thread.current.fetch(:hoge) #=> KeyError "key not found: hoge" Thread.current.fetch(:hoge, 123) #=> 123 27
  28. 28. Thread.name= Ruby 2.3からあった。Windows 10 でもスレッドに名前 をつけられるようになったらしい。 Thread.new do Thread.current.name = "hogehoge" end % ps -L -o pid,lwp,comm -p 14655 PID LWP COMMAND 14655 14655 ruby 14655 14656 ruby-timer-thr 14655 14657 hogehoge 28
  29. 29. Time.at で秒以下の単位を指定 Time.at(1511056368, 123456).nsec #=> 123456000 Time.at(1511056368, 123456.789).nsec #=> 123456789 Time.at(1511056368, 123456789, :nsec).nsec #=> 123456789 29
  30. 30. KeyError#receiver, key 追加 例外が発生したオブジェクトとキーを返す begin hash = {a: 123} hash.fetch(:b) rescue KeyError => e e.receiver #=> {a: 123} e.key #=> :b end 30
  31. 31. BasicSocket#read_nonblock, #write_nonblock が O_NONBLOCK をセ ットしない require 'io/nonblock' s = TCPSocket.new("127.0.0.1", 80) s.nonblock? #=> false s.read_nonblock(10) # Ruby 2.4 s.nonblock? #=> true # Ruby 2.5 s.nonblock? #=> false 31
  32. 32. Random.raw_seed が Random.urandom に名前変更 32
  33. 33. Socket::Ifaddr#vhid 追加 BSD? 33
  34. 34. 標準添付ライブラリ 34
  35. 35. Bundler Gem 標準添付 35
  36. 36. ERB#result_with_hash 追加 require "erb" name = "tmtms" ERB.new("Hello <%=name%>").result #=> "Hello tmtms" require "erb" ERB.new("Hello <%=name%>").result_with_hash(name: "tmtms") 36
  37. 37. ERB: trim 指定時 CR LF を trim # Ruby 2.4 require 'erb' ERB.new("<%=123%>rn", nil, 1).result #=> "123rn" # Ruby 2.5 require 'erb' ERB.new("<%=123%>rn", nil, 1).result #=> "123" 37
  38. 38. Net::HTTP ステータス追加 '102' => Net::HTTPProcessing, '208' => Net::HTTPAlreadyReported, '421' => Net::HTTPMisdirectedRequest, '451' => Net::HTTPUnavailableForLegalReasons, '506' => Net::HTTPVariantAlsoNegotiates, '508' => Net::HTTPLoopDetected, '510' => Net::HTTPNotExtended, 38
  39. 39. Net::HTTP::STATUS_CODES 追加 require 'net/http/status' Net::HTTP::STATUS_CODES #=> {100=>"Continue", 101=>"Switching Protocols", # 102=>"Processing", 200=>"OK", 201=>"Created", # 202=>"Accepted", 203=>"Non-Authoritative Information", # 204=>"No Content", 205=>"Reset Content", 206=>"Partial Content" # ...} 39
  40. 40. Net::HTTP.new に no_proxy 引数追加 7番目の引数 no_proxy = "example.com,example.net:8080" HTTP.new(address, port, proxy_addr, proxy_port, proxy_user, proxy_pass, no_proxy) 40
  41. 41. Net::HTTP: http_proxy環境変数 を使用 41
  42. 42. Net::HTTP: http_proxy環境変数 の認証情報を使用 http://user:password@proxy:port/ Windowsを除く 42
  43. 43. RbConfig::SIZE_OF, RbConfig::LIMITS 追加 require "rbconfig/sizeof" RbConfig::SIZEOF #=> {"int"=>4, "short"=>2, "long"=>8, "long long"=>8, # "__int128"=>16, "off_t"=>8, "void*"=>8, "float"=>4, # "double"=>8, "time_t"=>8, "clock_t"=>8, "size_t"=>8, # ... RbConfig::LIMITS #=> {"FIXNUM_MAX"=>4611686018427387903, # "FIXNUM_MIN"=>-4611686018427387904, "CHAR_MAX"=>127, # "CHAR_MIN"=>-128, "SCHAR_MAX"=>127, "SCHAR_MIN"=>-128, # "UCHAR_MAX"=>255, "WCHAR_MAX"=>2147483647, # ... 43
  44. 44. Ripper#state, Ripper::EXPR_BEG 追加 44
  45. 45. Set#to_s, #=== 追加 s = Set.new([1, 2, 3]) # Ruby 2.4 s.to_s #=> "#<Set:0x00560b825243b8>" s === 2 #=> false s === s #=> true # Ruby 2.5 s.to_s #=> "#<Set: {1, 2, 3}>" s === 2 #=> true Set#include? と同じ s === s #=> false 45
  46. 46. WEBrick: Serve Name Indication (SNI) サポート 46
  47. 47. 標準ライブラリから mathn 削除 もうあまり使われてない? 47
  48. 48. 標準ライブラリから ubygems 削除 rubygems を -rubygems コマンドラインオプションで使 用できるようにするためのもの。 rubygems は標準で使用されるためもう不要。 48
  49. 49. その他 49
  50. 50. バックトレースの順番 標準エラー出力が端末の場合に表示が逆順 (EXPERIMENTAL) # Ruby 2.4 % ruby /tmp/a.rb /tmp/a.rb:8:in `c': unhandled exception from /tmp/a.rb:5:in `b' from /tmp/a.rb:2:in `a' from /tmp/a.rb:10:in `<main>' # Ruby 2.5 % ruby /tmp/a.rb Traceback (most recent call last): 3: from /tmp/a.rb:10:in `<main>' 2: from /tmp/a.rb:2:in `a' 1: from /tmp/a.rb:5:in `b' /tmp/a.rb:8:in `c': unhandled exception 50
  51. 51. バックトレースの順番 標準エラー出力が端末でなければ従来通り % ruby /tmp/a.rb Traceback (most recent call last): 3: from /tmp/a.rb:10:in `<main>' 2: from /tmp/a.rb:2:in `a' 1: from /tmp/a.rb:5:in `b' /tmp/a.rb:8:in `c': unhandled exception % ruby /tmp/a.rb 2>&1 | cat /tmp/a.rb:8:in `c': unhandled exception from /tmp/a.rb:5:in `b' from /tmp/a.rb:2:in `a' from /tmp/a.rb:10:in `<main>' 51
  52. 52. configure で拡張ライブラリを強制 通常は環境に応じて自動判別 --with-ext オプションで強制できる コンパイルできる環境でない場合は make でエラー % ./configure --with-ext=openssl,+ % make ... *** Following extensions are not compiled: openssl: Could not be configured. It will not be installed. /misc/tmp/ruby-2.5.0-preview1/ext/openssl/extconf.rb:94 Check ext/openssl/mkmf.log for more details. *** Fix the problems, then remove these directories and try again exts.mk:1853: ターゲット 'note' のレシピで失敗しました make[1]: *** [note] エラー 1 make[1]: ディレクトリ '/misc/tmp/ruby-2.5.0-preview1' から出ます uncommon.mk:236: ターゲット 'build-ext' のレシピで失敗しました make: *** [build-ext] エラー 2 52
  53. 53. 以上 53

×