Baiklah, Anda tahu latihannya. Tim Ruby bekerja keras untuk menyusun versi baru yang penuh dengan fitur dan saya memilih favorit saya dan menulis tentangnya.
Jika Anda ingin membaca perubahan lengkapnya, itu dia di situs proyek Ruby. Masih banyak hal bagus lainnya di sana—ini hanyalah perubahan yang paling menonjol bagi saya.
Nama parameter blok default
Dalam banyak situasi ketika kita meneruskan sebuah blok di Ruby, blok tersebut menerima satu argumen (each
, map
, filter
dll). Sering kali, kita akhirnya memberi argumen tersebut nama yang cukup umum item
karena kami tahu bahwa kami sedang mengerjakan item dalam daftar.
(
"beige chinos",
"blue jorts",
"rainbow jorts",
).filter { |item| item =~ /jorts/ }
# => ("blue jorts", "rainbow jorts")
Di Ruby 3.4, it
telah ditambahkan sebagai nama default untuk parameter pertama yang diteruskan ke blok. Daripada menentukan nama dalam kasus sepele seperti di atas, Anda kini dapat menulis:
(
"beige chinos",
"blue jorts",
"rainbow jorts",
).filter { it =~ /jorts/ }
# => ("blue jorts", "rainbow jorts")
Penanganan koneksi yang lebih baik: “Happy Eyeballs Version 2”
Jujur saja: alasan mengapa hal ini masuk dalam daftar saya tahun ini adalah karena melihatnya di log perubahan mengarahkan saya ke RFC menarik yang belum pernah saya dengar sebelumnya! Saya menghabiskan beberapa jam membaca RFC dan beberapa cuplikan kode sumber dan saya pikir itu layak untuk dibicarakan.
Ruby 3.4 menambahkan implementasi RFC8305 (Happy Eyeballs Versi 2: Konektivitas Lebih Baik Menggunakan Konkurensi) untuk implementasi soket TCP-nya.
Singkatnya, RFC adalah upaya untuk menjelaskan cara bagi klien untuk menangani beberapa alamat IP yang dikembalikan oleh kueri DNS, khususnya dalam konteks jaringan dual-stack (IPv4 dan IPV6). Ini menjelaskan cara membuat permintaan DNScara mengurutkan alamat yang dikembalikan oleh mereka, dan cara memulai upaya koneksi bersamaan ke alamat tersebut dengan cara yang seimbang, memberikan respons cepat kepada pengguna tanpa menimbulkan beban sia-sia di server.
RFC8305 dibangun berdasarkan versi sebelumnya RFC6555. RFC6555 berbicara dalam istilah yang relatif tingkat tinggi tentang apa yang diperlukan dalam algoritma yang menggunakan nama host untuk membuat koneksi dalam lingkungan dual-stack dan merujuk pada pendekatan yang digunakan oleh Mozilla Firefox dan Google Chrome pada saat itu. RFC8305 lebih dari itu dan memberikan deskripsi yang lebih konkrit tentang apa yang harus dilakukan pada setiap tahap.
Satu hal yang sangat saya sukai dari pendekatan mereka adalah penyediaannya nilai default yang masuk akal untuk setiap parameter algoritmanya yang dapat disesuaikan, yang dicapai melalui pengukuran empiris waktu koneksi di berbagai perangkat. Perusahaan dengan jangkauan Apple, tempat RFC ini berasal, berada dalam posisi yang tepat untuk melakukan pengukuran pada skala yang diperlukan untuk menemukan default yang dapat diterapkan secara luas. Sangat menyenangkan melihat upaya yang dilakukan untuk menjadikan hasil pekerjaan mereka bermanfaat di luar tembok perusahaan mereka.
Saya kurang optimis tentang transisi IPv6 dibandingkan beberapa teman saya. Jika transisi tersebut berhasil, maka diperlukan periode menjalankan jaringan dual-stack yang tidak dapat dihindari. Ketika hal itu menyebabkan masalah pada jaringan rumah saya, saya mematikan IPv6 daripada mencoba men-debugnya. Jika kita ingin orang-orang menggunakan jaringan dual-stack—dan pada akhirnya IPv6—kita memerlukan pustaka soket yang melakukan hal yang benar secara default.
Pengecualian yang lebih jelas untuk menelusuri kembali
Oke, kita sudah selesai dengan lubang kelincinya dan kita punya lubang sederhana untuk menyelesaikannya.
Di Ruby 3.4, pengecualian penelusuran balik termasuk pemilik metode (kelas atau modul) serta nama metode asal pengecualian.
Mari kita lihat beberapa kode yang memunculkan pengecualian:
module Foo
class Bar
def inspect
1 + '1'
end
end
end
p Foo::Bar.new
Di Ruby 3.3 dan sebelumnya, ini akan mencetak backtrace seperti:
/tmp/foo.rb:4:in `+': String can't be coerced into Integer (TypeError)
from /tmp/foo.rb:4:in `inspect'
from /tmp/foo.rb:9:in `p'
from /tmp/foo.rb:9:in `'
Ruby 3.4 mencetak nama modul/kelas yang berisi masing-masing metode di jalur tumpukan, seperti:
/tmp/foo.rb:4:in `Integer#+': String can't be coerced into Integer (TypeError)
from /tmp/foo.rb:4:in `Foo::Bar#inspect'
from /tmp/foo.rb:9:in `Kernel#p'
from /tmp/foo.rb:9:in `'
Ini adalah perubahan kecil, tapi saya sangat percaya pada apa pun yang membuatnya lebih cepat untuk memahami apa yang dilakukan sebuah kode. Saya senang melihat tim Ruby masih sangat menghargai pengalaman pengembang. Itu salah satu bagian terbaik dalam menulis bahasa.
Itu saja dari saya. Jika Anda menikmati postingan ini, hubungi fitur favorit Anda dari Ruby 3.4 dan keju terbaik yang pernah Anda makan pada Natal ini.
Anda dapat menemukan saya di mastodon atau langit biru. ✌🏻💖🎄