ตามประเพณีของ Ruby ทีมแกนปล่อย Ruby 3.4 วันที่ 25 ธันวาคม 2024! ถ้าคุณรัก Ruby อย่างเรา คุณคงสงสัยว่า Ruby 3.4 มีอะไรใหม่ ไม่มี huge changes ใน release นี้ แต่มี 몇 อย่างที่น่าสนใจมาก

มาขุดลึก language changes ก่อน
Language Changes (การเปลี่ยนแปลงภาษา)
Language changes เป็นการเปลี่ยนแปลงที่ relevant ที่สุดสำหรับ Ruby developers ส่วนใหญ่ มาดูแต่ละอย่างเร็วๆ!
Frozen String Literals
ถ้าคุณเขียน Ruby มาพักใหญ่ๆ คุณน่าจะเคยเห็นไฟล์ที่ขึ้นต้นด้วย:
# frozen_string_literal: true
ตัวอย่างข้างต้นคือ magic comment และมันมีความหมายต่อ Ruby interpreter จริงๆ! คอมเมนต์นี้บอก interpreter ให้ treat แต่ละ string ในไฟล์นี้เหมือนว่า freeze ถูกเรียกแล้ว ถ้าคุณพยายาม modify String ในไฟล์ที่มี magic comment นี้ คุณจะได้ runtime error
ใน Ruby 3.4 strings จะ ทำงาน เหมือน frozen โดยค่าเริ่มต้น การพยายาม mutate จะทำให้ได้ deprecation warning แทน error เวอร์ชัน Ruby ในอนาคตจะ enforce default frozen string literals โดย raise exception ถ้าคุณพยายาม mutate พวกมัน ช่วง transition นี้จะให้ Ruby developers เวลา migrate apps ของพวกเขา
Default Block Parameter
Ruby 3.4 นำเสนอ default block parameter เพื่อทำให้ short code blocks สะอาดขึ้น
ก่อน Ruby 2.7 การพิมพ์แต่ละ element ของ array ด้วยเมธอด each ดูประมาณนี้:
[1, 2, 3].each { |item| puts item }
Ruby 2.7 นำเสนอ numbered parameters เพื่อกำจัดความจำเป็นในการตั้งชื่อ หลัง Ruby 2.7 คุณเขียนโค้ดเดียวกันได้เป็น:
[1, 2, 3].each { puts _1 }
การปรับปรุงของ Ruby 2.7 straightforward แต่ไม่ค่อยชัดเจน ถ้าคุณไม่คุ้นเคย syntax นี้ คุณอาจ掙扎เข้าใจว่ากำลังเกิดอะไรขึ้น Ruby 3.4 นำเสนอวิธีที่ดีกว่านี้อีกสำหรับทำสิ่งเดียวกัน:
[1, 2, 3].each { puts it }
Keyword Splatting nil
ใน Ruby versions ก่อน 3.4 การใช้ double splat operator (**) กับ nil จะ raise TypeError เรื่องนี้ทำ sense บ้าง เพราะ nil ไม่สามารถ implicitly convert เป็น hash ได้
Ruby 3.4 ให้การเปลี่ยนแปลงง่ายๆ — มัน implicitly converts nil เป็น hash การเรียก ** บน nil จะเหมือนเรียก ** บน empty hash
Core Classes Updates (การอัปเดต Core Classes)
Core class updates ไม่ได้ relevant ทันทีเหมือน language changes แต่ก็ worth understanding!
Exception#set_backtrace
Feature request บน Ruby issue tracker อธิบายการ set backtrace ด้วย array of strings ก่อนการเปลี่ยนแปลงใน Ruby 3.4 ว่า "lossy" Exception ก่อนหน้านี้คืนค่า nil บน #backtrace_locations
ใน Ruby 3.4 Exception#set_backtrace จะ accept Thread::Backtrace::Location array เพื่อให้คุณ rebuild Backtrace instance และมี Exception ทำงานครบถ้วน
Range#size
Range#size ก็มีพฤติกรรมใหม่ใน Ruby 3.4 ถ้า range ที่ size ถูกเรียกไม่ iterable Ruby จะ throw TypeError ตอนนี้ นี่คือการเปลี่ยนแปลงเล็กน้อยของพฤติกรรมที่คุณจะสังเกตได้ก็ต่อเมื่อคุณเรียก size บน subset เล็กของ ranges
การเปลี่ยนแปลงอื่นๆ ใหม่ใน Ruby 3.4
อีกการเปลี่ยนแปลงเล็กใน Ruby 3.4 คือ methods ที่ถูกส่งไป block ที่พวกมันไม่ใช้ ตอนรันใน verbose mode Ruby จะ throw warning ถ้าคุณส่ง block ไป method ที่ไม่ใช้ block
คุณอาจยินดีที่จะรู้ว่า Ruby 3.4 ปรับปรุงประสิทธิภาพของ Array.each เนื่องจาก implementation rewrite!
สุดท้าย อีกการอัปเดตคือวิธีการแสดง error messages และ backtraces Ruby จะใช้ single quotes แทน backticks เมื่อเกี่ยวข้อง และแสดง class name ก่อน method name
การอัปเกรดไป Ruby 3.4
การอัปเกรดไป Ruby 3.4 ไม่ควรเป็น major lift สำหรับคนส่วนใหญ่ ส่วนที่ใช้แรงมากที่สุดจะเป็นการลบ frozen string magic comments ที่ไม่จำเป็นทั้งหมด! การใช้เวลาอัปเกรดเพื่อใช้ประโยชน์จากสิ่งใหม่ๆ ใน Ruby 3.4 จะคุ้มค่า อย่าล่าช้า!
และอย่าลืม — เพื่อรับ Ruby news และ tutorials แบบนี้ในกล่องจดหมาย สมัคร newsletter ของ Honeybadger!