Ruby

Ruby 2.7

Fedora 32 menyediakan Ruby versi 2.7. Dengan pembaruan besar dari Ruby 2.6, Fedora menjadi platform pengembangan Ruby yang unggul.

Perubahan sejak Ruby 2.6:

Ruby 2.7 hadir dengan beberapa fitur baru dan peningkatan kinerja.

Peningkatan kinerja

  • JIT [Eksperimental]

  • Strategi cache Fiber berubah dan penciptaan fiber dipercepat.

  • Module#name, true.to_s, false.to_s, dan nil.to_s sekarang selalu mengembalikan String beku. String yang dikembalikan selalu sama untuk objek tertentu. [Eksperimental]

  • Kinerja Monitor dan MonitorMixin ditingkatkan.

  • Kinerja CGI.escapeHTML ditingkatkan.

  • Cache metode Per-call-site, yang telah ada sejak sekitar 1.9, telah diperbaiki: tingkat cache hit dinaikkan dari 89% menjadi 94%.

  • Metode RubyVM::InstructionSequence#to_binary menghasilkan biner terkompilasi. Ukuran biner dikurangi.

Perubahan penting lainnya

  • Beberapa pustaka standar diperbarui.

    • Bundler 2.1.2

    • RubyGems 3.1.2

    • Racc 1.4.15

    • CSV 3.1.2

    • REXML 3.2.3

    • RSS 0.2.8

    • StringScanner 1.0.3

    • Beberapa pustaka lain yang tidak memiliki versi asli juga diperbarui.

  • Pustaka berikut tidak lagi berupa gem yang dibundel. Instal gem yang sesuai untuk menggunakan fitur ini.

    • CMath (cmath gem)

    • Scanf (scanf gem)

    • Shell (shell gem)

    • Synchronizer (sync gem)

    • ThreadsWait (thwait gem)

    • E2MM (e2mmap gem)

  • profile.rb dihapus dari pustaka standar.

  • Mempromosikan stdlib ke gem default

    • Gem default berikut diterbitkan di rubygems.org

      • benchmark

      • cgi

      • delegate

      • getoptlong

      • net-pop

      • net-smtp

      • open3

      • pstore

      • singleton

    • Gem default berikut hanya dipromosikan di ruby-core, tetapi belum dipublikasikan di rubygems.org.

      • monitor

      • observer

      • timeout

      • tracer

      • uri

      • yaml

  • Proc.new dan proc tanpa blok dalam sebuah metode yang dipanggil dengan blok diperingatkan sekarang.

  • lambda tanpa blok dalam metode yang dipanggil dengan blok membangkitkan eksepsi.

  • Memperbarui versi Unicode dan versi Emoji dari 11.0.0 ke 12.0.0.

  • Memperbarui versi Unicode ke 12.1.0, menambahkan dukungan untuk U+32FF SQUARE ERA NAME REIWA.

  • Date.jisx0301, Date#jisx0301, dan Date.parse mendukung era Jepang baru.

  • Memerlukan kompiler untuk mendukung C99.

Detil perubahan

Pencocokan Pola [Eksperimental]

Pencocokan pola, fitur yang banyak digunakan dalam bahasa pemrograman fungsional, diperkenalkan sebagai fitur eksperimental. Hal ini dapat melintasi objek tertentu dan menetapkan nilainya jika cocok dengan 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

Perbaikan REPL

irb, lingkungan interaktif yang dibundel (REPL; Read-Eval-Print-Loop), sekarang mendukung penyuntingan multi-baris. Hal ini didukung oleh reline, sebuah pustaka yang kompatibel readline yang diimplementasikan dalam Ruby murni. Hal ini juga menyediakan integrasi rdoc. Dalam irb Anda dapat menampilkan referensi untuk kelas, modul, atau metode tertentu.

GC Pemadatan

Rilis ini memperkenalkan Compaction GC yang dapat menggabung ruang memori yang terfragmentasi.

Beberapa program Ruby yang multi-thread dapat menyebabkan fragmentasi memori, menyebabkan penggunaan memori yang tinggi dan kecepatan terdegradasi.

Metode GC.compact diperkenalkan untuk memadatkan heap. Fungsi ini memadatkan objek aktif di heap sehingga lebih sedikit halaman yang dapat digunakan, dan heap mungkin lebih ramah CoW (copy-on-write).

Pemisahan argumen posisional dan kata kunci

Konversi otomatis argumen kata kunci dan argumen posisional usang, dan konversi akan dihapus di Ruby 3.

Perubahan
  • Ketika metode panggilan memberikan Hash di argumen terakhir, dan ketika tidak memberikan kata kunci, dan ketika metode yang dipanggil menerima kata kunci, peringatan dipancarkan. Untuk terus memperlakukan hash sebagai kata kunci, tambahkan operator splat ganda untuk menghindari peringatan dan memastikan perilaku yang benar di Ruby 3.

        def foo(key: 42); end; foo({key: 42})   # diperingatkan
        def foo(**kw);    end; foo({key: 42})   # diperingatkan
        def foo(key: 42); end; foo(**{key: 42}) # OK
        def foo(**kw);    end; foo(**{key: 42}) # OK
  • Ketika metode panggilan memberikan kata kunci ke metode yang menerima kata kunci, tetapi tidak memberikan cukup argumen posisi yang diperlukan, kata kunci diperlakukan sebagai argumen posisi yang diperlukan terakhir, dan peringatan dipancarkan. Berikan argumen sebagai hash, bukan kata kunci, untuk menghindari peringatan dan memastikan perilaku yang benar di Ruby 3.

        def foo(h, **kw); end; foo(key: 42)      # diperingatkan
        def foo(h, key: 42); end; foo(key: 42)   # diperingatkan
        def foo(h, **kw); end; foo({key: 42})    # OK
        def foo(h, key: 42); end; foo({key: 42}) # OK
  • Ketika metode menerima kata kunci tertentu tetapi tidak splat kata kunci, dan hash atau kata kunci splat dilewatkan ke metode yang mencakup kunci simbol dan non-simbol, hash akan terus dipecah, dan peringatan akan dipancarkan. Anda akan perlu memperbarui kode yang memanggil untuk memberikan hash terpisah untuk memastikan perilaku yang benar di Ruby 3.

        def foo(h={}, key: 42); end; foo("key" => 43, key: 42)   # diperingatkan
        def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # diperingatkan
        def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
  • Jika metode tidak menerima kata kunci, dan dipanggil dengan kata kunci, kata kunci masih diperlakukan sebagai hash posisional, tanpa peringatan. Perilaku ini akan terus bekerja di Ruby 3.

        def foo(opt={});  end; foo( key: 42 )   # OK
  • Non-simbol yang diizinkan sebagai kunci argumen kata kunci jika metode menerima kata kunci sembarang.

        def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
  • **nil diperbolehkan dalam definisi metode untuk secara eksplisit menandai bahwa metode tidak menerima kata kunci. Memanggil metode tersebut dengan kata kunci akan menghasilkan ArgumentError.

        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
  • Memberikan splat kata kunci kosong ke metode yang tidak menerima kata kunci tidak lagi memberikan hash kosong, kecuali hash kosong diperlukan untuk parameter yang diperlukan, dalam hal ini peringatan akan dipancarkan. Hapus splat ganda untuk melanjutkan memberikan sebuah hash posisional.

        h = {}; def foo(*a) a end; foo(**h) # []
        h = {}; def foo(a) a end; foo(**h)  # {} dan peringatan
        h = {}; def foo(*a) a end; foo(h)   # [{}]
        h = {}; def foo(a) a end; foo(h)    # {}

Jika Anda ingin menonaktifkan peringatan pengusangan, silakan gunakan argumen baris perintah -W:no-deprecated atau menambahkan Warning[:deprecated] = false ke kode Anda.

Lihat pengumuman rilis hulu untuk informasi lebih rinci tentang rilis ini.

Jekyll 4.0

Generator halaman statis Jekyll dan plug-in-nya telah diperbarui ke versi 4.0.0. Versi ini mencakup perubahan berikut dibandingkan dengan versi 3.8:

  • Peningkatan kinerja yang signifikan

  • Pembersihan dan perbaikan bug

  • Perubahan kecil lainnya tidak kompatibel dengan rilis sebelumnya

Untuk informasi lebih lanjut tentang Jekyll 4.0.0, lihat https://jekyllrb.com/news/2019/08/20/jekyll-4-0-0-released/.