歡迎您光臨本站 註冊首頁

Ruby 2.7.0 穩定版發布:引入模式匹配、緊湊 GC,改進 REPL

←手機掃碼閱讀     admin @ 2019-12-26 , reply:0

Ruby 2.7.0 穩定版在聖誕節當天發布了,此版本引入了許多新特性和性能改進,最值得注意的包括:

  • 模式匹配(Pattern Matching)
  • REPL 改進
  • 緊湊 GC(Compaction GC)
  • 位置參數和關鍵字參數的分離

模式匹配(實驗性功能)

模式匹配是函數式編程語言中廣泛使用的特性,如果匹配某一個模式,它可以遍歷給定的對象並分配其值,目前尚處於實驗階段 [Feature #14912]


require "json"

json = <<END
{
  "name": "Alice",
  "age": 30,
  "children": [{ "name": "Bob", "age": 2 }]
}
END

case JSON.parse(json, symbolize_names: true)
in {name: "Alice", children: [{name: "Bob", age: age}]}
  p age #=> 2
end

有關該功能的具體細節請查看 Pattern matching - New feature in Ruby 2.7

REPL 改進

綁定的互動式環境 irb 現在支持多行編輯,由 reline 提供支持,reline 是一種與 readline 兼容的純 Ruby 實現。它還提供了 rdoc 集成。在 irb 中,可以顯示給定類、模塊或方法的引用。此外,binding.irb 中顯示的源代碼行和核心類對象的檢查結果現在以顏色區分顯示。

緊湊 GC(Compaction GC)

緊湊 GC 可以對碎片化的內存空間進行碎片整理。一些多線程 Ruby 程序可能會導致內存碎片,從而導致高內存使用率和速度下降。引入了 GC.compact 方法來壓縮堆,此函數壓縮堆中的活動對象,以便可以使用更少的頁,並且堆可能對 CoW 更友好。

位置參數和關鍵字參數的分離

關鍵詞參數和位置參數的自動轉換被標記為已廢棄(deprecated),自動轉換將會在 Ruby 3 中被移除。[功能 #14183]

  • 當方法傳入一個 Hash 作為最後一個參數,或者傳入的參數沒有關鍵詞的時候,會拋出警告。如果需要繼續將其視為關鍵詞參數,則需要加入兩個星號來避免警告並確保在 Ruby 3 中行為正常。

  def foo(key: 42); end; foo({key: 42})   # warned
  def foo(**kw);    end; foo({key: 42})   # warned
  def foo(key: 42); end; foo(**{key: 42}) # OK
  def foo(**kw);    end; foo(**{key: 42}) # OK
  • 當方法傳入一個 Hash 到一個接受關鍵詞參數的方法中,但是沒有傳遞足夠的位置參數,關鍵詞參數會被視為最後一個位置參數,並拋出一個警告。請將參數包裝為 Hash 對象來避免警告並確保在 Ruby 3 中行為正常。

  def foo(h, **kw); end; foo(key: 42)      # warned
  def foo(h, key: 42); end; foo(key: 42)   # warned
  def foo(h, **kw); end; foo({key: 42})    # OK
  def foo(h, key: 42); end; foo({key: 42}) # OK
  • 當方法接受關鍵詞參數傳入,但不會進行關鍵詞分割(splat),且傳入同時含有 Symbol 和非 Symbol 的 key,那麼 Hash 會被分割,但是會拋出警告。你需要在調用時傳入兩個分開的 Hash 來確保在 Ruby 3 中行為正常。

  def foo(h={}, key: 42); end; foo("key" => 43, key: 42)   # warned
  def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned
  def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
  • 當一個方法不接受關鍵詞,但是調用時傳入了關鍵詞,關鍵詞會被視為位置參數,不會有警告拋出。這一行為將會在 Ruby 3 中繼續工作。

  def foo(opt={});  end; foo( key: 42 )   # OK
  • 如果方法支持任意參數傳入,那麼非 Symbol 也會被允許作為關鍵詞參數傳入。[功能 #14183]

  def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
  • **nil 被允許使用在方法定義中,用來標記方法不接受關鍵詞參數。以關鍵詞參數調用這些方法會拋出 ArgumentError [功能 #14183]

  def foo(h, **nil); end; foo(key: 1)       # ArgumentError
  def foo(h, **nil); end; foo(**{key: 1})   # ArgumentError
  def foo(h, **nil); end; foo("str" => 1)   # ArgumentError
  def foo(h, **nil); end; foo({key: 1})     # OK
  def foo(h, **nil); end; foo({"str" => 1}) # OK
  • 將空的關鍵詞分割(splat)傳入一個不接受關鍵詞的方法不會繼續被當作空 Hash 處理,除非空哈希被作為一個必要參數,並且這種情況會拋出警告。請移除雙星號來將 Hash 作為位置參數傳入。[功能 #14183]

  h = {}; def foo(*a) a end; foo(**h) # []
  h = {}; def foo(a) a end; foo(**h)  # {} and warning
  h = {}; def foo(*a) a end; foo(h)   # [{}]
  h = {}; def foo(a) a end; foo(h)    # {}

如果要禁用「棄用提醒警告(deprecation warnings)」,請使用命令行參數-W:no-deprecated或添加Warning[:deprecated] = false到代碼中。

其它值得關注的新特性

  • 方法引用運算符,.:,作為實驗性功能加入了。功能 #12125功能 #13581

  • 實驗性地加入了把編號參數作為默認的塊參數的特性。功能 #4475

  • 無頭範圍實驗性地加入了。它可能儘管沒有無限範圍那麼有用,但它對開發 DSL 是非常有用的。功能 #14799


  ary[..3]  # identical to ary[0..3]
  rel.where(sales: ..100)
  • 新增了 Enumerable#tally,它會計算每個元素出現的次數。

  ["a", "b", "c", "b"].tally
  #=> {"a"=>1, "b"=>2, "c"=>1}

  def foo
  end
  private :foo
  self.foo
  • 新增 Enumerator::Lazy#eager。它會產生一個非懶惰的迭代器。[功能 #15901]

  a = %w(foo bar baz)
  e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
  p e.class               #=> Enumerator
  p e.map {|x| x + "?" }  #=> ["FOO!?", "BAR!?", "BAZ!?"]

性能改進

  • JIT [實驗性質]

    • 當優化假設不成功時,JIT 后的代碼可能會被重新編譯到優化程度較低的代碼。

    • 當方法(Method)被認為是純函數(pure)時,會進行方法內聯優化。這種優化方法仍是實驗性的,許多方法不被認為是純函數。

    • --jit-min-calls 的默認值從 5 調整到 10,000。

    • --jit-max-cache 的默認值從 1,000 調整到 100。

  • Symbol#to_sModule#nametrue.to_sfalse.to_s 和 nil.to_s` 現在始終返回一個凍結(frozen)字元串。返回的字元串始終和給定的對象相等。 [實驗性] [功能 #16150]

  • CGI.escapeHTML 的性能被提升了。GH-2226

其他自 2.6 版本以來顯著的變化

  • 一些標準庫已被更新
    • Bundler 2.1.0.pre.1
    • RubyGems 3.1.0.pre.1
    • CSV 3.1.2 (NEWS)
    • Racc 1.4.15
    • REXML 3.2.3 (NEWS)
    • RSS 0.2.8 (NEWS)
    • StringScanner 1.0.3
    • 一些其它沒有原始版本的庫也被更新了。
  • 現在進行塊方法調用時,如果 Proc.new 和 proc 在沒有 block 會產生警告。

  • lambda 在方法調用時如果沒有 block 會產生區塊錯誤。

  • Unicode 和 Emoji 版本從 11.0.0 更新至 12.0.0。[功能 #15321]

  • 更新 Unicode 至 12.1.0 版本,新增對於新年號「令和」 U+32FF 的支持。[功能 #15195]

  • Date.jisx0301Date#jisx0301 和 Date.parse 展示支持新的日本年號作為非正式的擴展功能,直到新的 JIS X 0301 發布。[功能 #15742]

  • 編譯器需要支持 C99 [雜項 #15347] *關於方言使用的具體信息請查閱:https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/C99

見 NEWS 或 提交日誌 以查看詳情。

下載地址

  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.bz2

    
    SIZE: 14703381
    SHA1: b54f4633174dbc55db77d9fd6d0ef90cc35503af
    SHA256: 7aa247a19622a803bdd29fdb28108de9798abe841254fe8ea82c31d125c6ab26
    SHA512: 8b8dd0ceba65bdde53b7c59e6a84bc6bf634c676bfeb2ff0b3604c362c663b465397f31ff6c936441b3daabb78fb7a619be5569480c95f113dd0453488761ce7
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.gz

    
    SIZE: 16799684
    SHA1: 6f4e99b5556010cb27e236873cb8c09eb8317cd5
    SHA256: 8c99aa93b5e2f1bc8437d1bbbefd27b13e7694025331f77245d0c068ef1f8cbe
    SHA512: 973fc29b7c19e96c5299817d00fbdd6176319468abfca61c12b5e177b0fb0d31174a5a5525985122a7a356091a709f41b332454094940362322d1f42b77c9927
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.xz

    
    SIZE: 11990900
    SHA1: 943c767cec037529b8e2d3cc14fc880cad5bad8d
    SHA256: 27d350a52a02b53034ca0794efe518667d558f152656c2baaf08f3d0c8b02343
    SHA512: dd5690c631bf3a2b76cdc06902bcd76a89713a045e136debab9b8a81ff8c433bbb254aa09e4014ca1cf85a69ff4bcb13de11da5e40c224e7268be43ef2194af7
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.zip

    
    SIZE: 20571744
    SHA1: fbebdd3a2a641f9a81f7d8db5abd926acea27e80
    SHA256: 8bf2050fa1fc76882f878fd526e4184dc54bd402e385efa80ef5fd3b810522e0
    SHA512: 5060f2dd3bfd271ef255b17589d6d014260d7ec2d97b48112b717ee01c62fe125c3fe04f813e02d607cea3f0a2a812b14eb3a28d06c2551354dfeff5f4c3dd6b

享受使用 Ruby 2.7 編程吧!


[admin ]

來源:OsChina
連結:https://www.oschina.net/news/112338/ruby-2-7-0-released
Ruby 2.7.0 穩定版發布:引入模式匹配、緊湊 GC,改進 REPL已經有356次圍觀

http://coctec.com/news/all/show-post-221721.html