發布 Ruby 2.7.0 編程語言

經過一年的發展 發表 釋放 Ruby 2.7.0,一種動態的、面向對象的編程語言,程序開發效率很高,並融合了 Perl、Java、Python、Smalltalk、Eiffel、Ada 和 Lisp 的最佳功能。 該項目代碼在BSD(“2-clause BSDL”)和“Ruby”許可證下分發,這是指最新版本的GPL許可證,與GPLv3完全兼容。 Ruby 2.7 是按照計劃開發流程的第七個主要版本,該流程需要一年的時間來準備功能改進,並每 2-3 個月發布一次維護版本。

主要的 改進:

  • 實驗性的 支持 模式匹配 (模式匹配),它允許您迭代給定對象並在與模式匹配時分配一個值。

    case [0, [1, 2, 3]] in [a, [b, *c]] pa #=> 0
    PB #=> 1
    pc #=> [2, 3] 結束

    情況 {a: 0, b: 1}
    在{a:0,x:1}中
    :不可用
    在 {a: 0, b: var} 中
    p var #=> 1
    結束

  • 交互式計算 irb(REPL、Read-Eval-Print-Loop)的 shell 現在具有多行編輯功能,使用 readline 兼容庫實現 換線,用 Ruby 編寫。 集成了 rdoc 支持,允許您查看 irb 中指定類、模塊和方法的參考信息。 提供通過 Binding#irb 顯示的代碼行的顏色突出顯示以及基類對象的檢查結果。

    發布 Ruby 2.7.0 編程語言

  • 新增緊湊型垃圾收集器(Compaction GC),可以對某個區域的內存進行碎片整理,解決了一些多線程Ruby應用程序中出現的內存碎片導致的性能和內存消耗問題。 將對像打包到堆上 建議 GC.compact方法,可以減少使用的內存頁數並優化操作堆
    CoW(寫時復制)。

  • 實施 準備根據列表位置(“def foo(a,b,c)”)和關鍵字(“def foo(key: val)”)分隔參數。 基於關鍵字和位置的自動參數轉換已被棄用,並且在 Ruby 3.0 分支中將不再受支持。 具體來說,它已棄用使用最後一個參數作為關鍵字參數,將基於關鍵字的參數作為最後一個哈希參數傳遞,並將最後一個參數拆分為位置參數和關鍵字參數。

    def foo(鍵: 42); 結尾; foo({key: 42}) # 警告
    def foo(**kw); 結尾; foo({key: 42}) # 警告
    def foo(鍵: 42); 結尾; foo(**{key: 42}) # 好的
    def foo(**kw); 結尾; foo(**{key: 42}) # 好的

    def foo(h, **kw); 結尾; foo(鍵: 42) #警告
    def foo(h, 鍵: 42); 結尾; foo(key: 42) # 警告
    def foo(h, **kw); 結尾; foo({key: 42}) # 好的
    def foo(h, 鍵: 42); 結尾; foo({key: 42}) # 好的

    def foo(h={}, 鍵: 42); 結尾; foo("key" => 43, key: 42) #warned
    def foo(h={}, 鍵: 42); 結尾; foo({"key" => 43, key: 42}) # 警告
    def foo(h={}, 鍵: 42); 結尾; foo({"key" => 43}, key: 42) # 好的

    def foo(opt={}); 結尾; foo( key: 42 ) # 好

    def foo(h, **nil); 結尾; foo(key: 1) # 參數錯誤
    def foo(h, **nil); 結尾; foo(**{key: 1}) # 參數錯誤
    def foo(h, **nil); 結尾; foo("str" ​​=> 1) # 參數錯誤
    def foo(h, **nil); 結尾; foo({key: 1}) # 好的
    def foo(h, **nil); 結尾; foo({"str" ​​=> 1}) # 好的

    h = {}; def foo(*a) 結束; foo(**h) # [] h = {}; def foo(a) 結束; foo(**h) # {} 和警告
    h = {}; def foo(*a) 結束; foo(h) # [{}] h = {}; def foo(a) 結束; foo(h) # {}

  • 機會 默認情況下,塊參數使用編號變量名稱。

    [1, 2, 3].each { put @1 } # 就像 [1, 2, 3].each { |i| 放我 }

  • 對沒有初始值的範圍的實驗支持。

    ary[..3] # 與 ary[0..3] 相同 rel.where(銷售額: ..100)

  • 新增 Enumerable#tally 方法,統計每個元素出現的次數。

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

  • 允許使用“self”文字調用私有方法

    定義 foo
    結束
    私人:foo
    self.foo

  • 添加了 Enumerator::Lazy#eager 方法以從惰性枚舉器 (Enumerator::Lazy) 生成常規枚舉。

    a = %w(foo bar baz)
    e = a.lazy.map {|x| x.upcase }.map {|x| x+“!” }。渴望的
    p e.class #=> 枚舉器
    p e.map {|x| x + “?” } #=> [“FOO!?”,“BAR!?”,“BAZ!?”]

  • 實驗性 JIT 編譯器的開發仍在繼續,它可以顯著提高 Ruby 語言應用程序的性能。 Ruby 的 JIT 編譯器首先將 C 代碼寫入磁盤,然後調用外部 C 編譯器生成機器指令(支持調用 GCC、Clang 和 Microsoft VC++)。 新版本實現了必要時內聯部署的方法,保證編譯時選擇性應用優化模式,“--jit-min-calls”默認值從5增加到10000,“--jit-max-”緩存”從1000到100 。
  • 改進了 CGI.escapeHTML、Monitor 和 MonitorMixin 的性能。
  • Module#name、true.to_s、false.to_s 和 nil.to_s 確保返回的字符串對於指定對象來說是未更改的。
  • RubyVM::InstructionSequence#to_binary 方法生成的二進製文件的大小已減小;
  • 內置組件的更新版本,包括
    捆綁器 2.1.2、RubyGems 3.1.2、
    拉克 1.4.15,
    CSV 3.1.2、REXML 3.2.3、
    RSS 0.2.8,
    字符串掃描儀 1.0.3;

  • 庫從基礎發行版轉移到外部 gem 包
    CMath(cmath gem),
    Scanf(掃描寶石),
    貝殼(貝殼寶石)
    同步器(同步寶石),
    ThreadsWait(思考寶石),
    E2MM(e2mmap 寶石)。

  • 默認的 stdlib 模塊發佈在 ruby​​gems.org 上:
    基準,
    計算機圖形圖像處理,
    代表
    獲取選擇長,
    網絡流行音樂,
    網絡SMTP
    打開3,
    存儲庫,
    單例。 監視器模塊未移至 ruby​​gems.org
    觀察者
    暫停
    示踪劑
    烏里,
    yaml,僅隨 ruby​​-core 提供。

  • 現在構建 Ruby 需要支持 C99 標準的 C 編譯器。

來源: opennet.ru

添加評論