Ruby 2.7.0-preview3 Dirilis

Kami dengan senang hati mengumumkan rilis dari Ruby 2.7.0-preview3.

Sebuah versi preview dirilis untuk mengumpulkan umpan balik rilis final yang direncanakan rilis pada bulan Desember. Versi ini dirilis terutama untuk mengkonfirmasi kompatibilitas dari keyword argument.

Selain itu, preview ini juga memperkenalkan sejumlah fitur baru dan perbaikan performa, terutama:

  • Compaction GC
  • Pattern Matching
  • REPL improvement
  • Separation of positional and keyword arguments

Compaction GC

Rilis ini memperkenalkan Compaction GC yang dapat defragment sebuah fragmented memory space.

Beberapa multi-threaded dari program Ruby dapat menyebabkan memory fragmentation, menyebabkan penggunaan memory tinggi dan penurunan kecepatan.

Method GC.compact dikenalkan untuk me-compact heap. Fungsi ini me-compact objek di dalam heap sehingga sedikit page yang akan digunakan dan heap bisa jadi lebih CoW bersahabat. [Feature #15626]

Pattern Matching [Experimental]

Pattern matching, fitur yang banyak digunakan dalam bahasa pemrograman fungsional, dikenalkan sebagai sebuah fitur eksperimental. [Feature #14912]

Ini dapat melewati sebuah objek dan menetapkan nilainya jika cocok dengan sebuah pola.

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

Untuk lebih detail, mohon lihat Pattern matching - New feature in Ruby 2.7.

REPL improvement

irb, membungkus interactive development (REPL; Read-Eval-Print-Loop), sekarang mendukung suntingan multi-line. Ini didukung oleh reline, readline yang sesuai dengan implementasi murni dari Ruby. Ini juga menyediakan integrasi rdoc. Di dalam irb Anda dapat menampilkan referensi sebuah class, module, atau method. [Feature #14683], [Feature #14787], [Feature #14918]

Selain itu, baris kode ditampilkan pada binding.irb dan hasil pemeriksaan objek core-class sekarang berwarna.

Separation of positional and keyword arguments

Konversi otomatis dari keyword argument dan positional argument sudah usang dan akan dihapus di Ruby 3. [Feature #14183]

  • Ketika sebuah pemanggilan method melewati sebuah Hash pada argument terakhir, ketika melewati keyword kosong, dan ketika method yang dipanggil menerima keyword, sebuah peringatan dikeluarkan. Untuk melanjutkan sebagai keyword, menambahkan sebuah double splat operator untuk menghindari peringatan dan memastikan perilaku yang benar pada 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
    
  • Ketika sebuah pemanggilan method melewati keyword ke sebuah method yang menerima keyword, tetapi tidak memenuhi positional argument yang diperlukan, keyword akan dianggap sebagai sebuah required positional argument final dan sebuah peringatan dikeluarkan. Melewati argument sebagai sebuah hash ketimbang keyword untuk menghindari peringatan dan memastikan perilaku yang benar pada 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
    
  • Ketika sebuah method menerima keyword tertentu, tetapi bukan sebuah keyword splat dan sebuah hash atau keyword splat dilewatkan method yang memasukkan key Symbol dan non-Symbol, hash akan lanjut dengan memisahkan dan sebuah peringatan dikeluarkan. Anda akan butuh pemanggilan kode untuk melewati hash yang terpisah untuk memastikan perilaku yang benar pada 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
    
  • Jika sebuah method tidak menerima keyword dan dipanggil dengan keyword, keyword akan dianggap sebagai sebuah positional hash tanpa peringatan. Perilaku ini akan berlanjut pada Ruby 3.

    def foo(opt={});  end; foo( key: 42 )   # OK
    
  • Non-symbol diperbolehkan sebagai sebuah keyword argument jika method menerima arbitrary keyword. [Feature #14183]

    def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
    
  • **nil diperbolehkan pada definisi method sebagai penanda langsung bahwa method menerima keyword kosong. Memanggil method seperti itu dengan keyword akan menyebabkan ArgumentError. [Feature #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
    
  • Melewatkan sebuah keyword splat kosong pada sebuah method yang tidak menerima keyword tidak akan lagi melewati sebuah hash kosong, kecuali hash kosong dibutuhkan sebagai sebuah required parameter, di mana kasus sebuah peringatan akan dikelurkan. Hilangkan double splat untuk melanjutkan sebuah positional hash. [Feature #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)    # {}
    

CATATAN: Sangat banyak peringatan yang usang dari keyword argument incompatibility telah ditunjuk terlalu bertele-tele. Saat ini, ada dua kemungkinan solusi didiskusikan; menonaktifkan peringatan deprecation secara otomatis (#16345) atau menyembunyikan peringatan yang sama (#16289). Keputusan akhir belum dibuat, tetapi akan diselesaikan saat rilis resmi.

Fitur Baru Penting Lainnya

  • Sebuah method reference operator, .:, telah dikenalkan sebagai sebuah fitur eksperimental pada preview sebelumnya, namun telah dikembalikan. [Feature #12125], [Feature #13581], [Feature #16275]

  • Numbered parameter sebagai default block parameter dikenalkan sebagai sebuah fitur eksperimental. [Feature #4475]

  • Sebuah beginless range secara eksperimental dikenalkan. Ini mungkin tidak berguna seperti endless range, tetapi sangat baik untuk penggunan DSL. [Feature #14799]

    ary[..3]  # identical to ary[0..3]
    rel.where(sales: ..100)
    
  • Enumerable#tally ditambahkan. Ini menghitung banyak elemen dari setiap elemen.

    ["a", "b", "c", "b"].tally
    #=> {"a"=>1, "b"=>2, "c"=>1}
    
  • Pemanggilan sebuah private method pada self sekarang diperbolehkan. [Feature #11297], [Feature #16123]

    def foo
    end
    private :foo
    self.foo
    
  • Enumerator::Lazy#eager ditambahkan. Ini menghasilkan sebuah non-lazy enumerator dari sebuah lazy enumerator. [Feature #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!?"]
    

Perbaikan performa

  • JIT [Eksperimental]

    • Kode JIT-ed di-recompile untuk kode less-optimized ketika sebuah asumsi optimisasi dibatalkan.

    • Method inlining dilakukan ketika sebuah method dianggap murni. Optimisasi ini masih eksperimental dan banyak method dianggap tidak murni.

    • Nilai default dari --jit-min-calls diubah dari 5 ke 10,000.

    • Nilai default dari --jit-max-cache diubah dari 1,000 ke 100.

  • Symbol#to_s (dikembalikan), Module#name, true.to_s, false.to_s, dan nil.to_s sekarang selalu mengembalikan sebuah frozen string. String yang dikembalikan selalu sama untuk sebuah objek. [Eksperimental] [Feature #16150]

  • Performa dari CGI.escapeHTML ditingkatkan. GH-2226

  • Performa dari Monitor dan MonitorMixin ditingkatkan. [Feature #16255]

Perubahan penting lainnya sejak 2.6

  • Beberapa pustaka standar diperbarui.
    • Bundler 2.1.0.pre.3 (History)
    • RubyGems 3.1.0.pre.3 (History)
    • CSV 3.1.2 (NEWS)
    • Racc 1.4.15
    • REXML 3.2.3 (NEWS)
    • RSS 0.2.8 (NEWS)
    • StringScanner 1.0.3
    • Beberapa pustaka lainnya yang tidak memiliki versi asli juga diperbarui.
  • Memasukkan stdlib sebagai default gem
    • default gem di bawah ini telah dipublikasikan ke rubygems.org
      • benchmark
      • cgi
      • delegate
      • getoptlong
      • net-pop
      • net-smtp
      • open3
      • pstore
      • singleton
    • default gem di bawah ini hanya dimasukkan ke ruby-core, tetapi belum dipublikasikan ke rubygems.org.
      • monitor
      • observer
      • timeout
      • tracer
      • uri
      • yaml
  • Proc.new dan proc tanpa block dalam sebuah method dipanggil dengan sebuah block akan diperingatkan sekarang.

  • lambda tanpa block dalam sebuah method dipanggil dengan sebuah block errs.

  • Memperbarui versi Unicode dan Emoji dari 11.0.0 ke 12.0.0. [Feature #15321]

  • Memperbarui versi Unicode ke 12.1.0, menambahkan dukungan U+32FF SQUARE ERA NAME REIWA. [Feature #15195]

  • Date.jisx0301, Date#jisx0301, dan Date.parse mendukung Japanese era yang baru. [Feature #15742]

  • Membutuhkan compiler untuk mendukung C99 [Misc #15347]
  • Regexp#match{?} dengan nil menimbulkan TypeError sebagai String, Symbol. [Feature #13083] dikembalikan

3895 berkas berubah, 213426 sisipan(+), 96934 terhapus(-)

Lihat NEWS atau commit logs untuk lebih detail.

Dengan perubahan tersebut, stat sejak Ruby 2.6.0!

Nikmati memprogram dengan Ruby 2.7!

Unduh

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

    SIZE: 14630824
    SHA1: 1fa35d8a26dfc814e92fa259095f4cf70f386f87
    SHA256: df2ddee659873e6fc30a8590ecffa49cf3a4ef81fa922b0d09f821b69ee88bc3
    SHA512: 5d8e99e3fd984c7d05c0bc483e1504e81ccdb920cbb2d78cad3c314e197b30316b692fd0199f836acac41246e3a713cb81dc6dd64c27cba56f807df4c193db1a
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.gz

    SIZE: 16723536
    SHA1: 7554926ee29a344da4b53d67fc296d70fdbe60ca
    SHA256: 9baa1f5096ebc2a0923df628d7dc7105da3789c1bf8b873469d9010249736b00
    SHA512: 8fad3e761fd54036fee974a9f33e4db31d9a8a878b1181a08724388f5a1da548ab249136356f675797e9c43b565777bf22e6a419db1364336f134b31f4e75b33
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.xz

    SIZE: 11923988
    SHA1: f3c54538915483e5ddc714ac23414e7c47048b12
    SHA256: ad9d61e55ac224e3447a762e001965839846f9658f87a0e792840887cfe61b8c
    SHA512: 2b6844f34d32f1013dc3110043e6ece33a083b20f1343dea9a14311bda0017e8f56fc7d73be1616999b22ce430d7ba59a77bb0892d27c6d1ec243c3860086133
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.zip

    SIZE: 20691541
    SHA1: d18b494cda4db751d8b3f5026404e348f3f682e3
    SHA256: 2bc95f67f271b6a41fc3dd40536705b4a7974df8a2fa33ff0758a60822291781
    SHA512: af9f728aebc53693cbd9f78a632c82e851e9f83dfc0c53979fdc37c627b11482c8435ce12dbb1d5a7253e998ea989759be699e6a00aae18384d2d765650cb0d7
    

Apa itu Ruby

Ruby pertama kali dikembangkan oleh Matz (Yukihiro Matsumoto) pada 1993 dan sekarang dikembangkan sebagai Open Source. Ruby berjalan di berbagai jenis platform dan digunakan di seluruh dunia khususnya pengembangan web.