Ruby 4.0 là một bản phát hành lớn, được ra mắt vào dịp kỷ niệm 30 năm thành lập Ruby (25 tháng 12 năm 2025) để kỷ niệm 30 năm thành lập cộng đồng chứ không phải do những thay đổi lớn mang tính đột phá.
Tôi rất ngạc nhiên khi biết rằng Ruby không thực sự tuân theo phiên bản ngữ nghĩa!
Thay vào đó, Matz (người tạo ra Ruby) tăng phiên bản chính khi những thay đổi gây ấn tượng với anh ấy. Phiên bản này đánh dấu 30 năm Ruby và giới thiệu các tính năng mở rộng ngôn ngữ.

Tin tốt cho những người theo chủ nghĩa Ruby nâng cấp lên Ruby 4 là việc nâng cấp sẽ tương đối dễ dàng. Có một số tính năng mới như Ruby::Box và ZJIT , một số cải tiến về tính đồng thời và một số cải tiến khác hầu như tương thích ngược.
Hãy cùng tìm hiểu xem điều gì đã thay đổi trong Ruby 4—và cách bạn có thể nâng cấp một cách suôn sẻ.
Ruby::Box? là gì
Một trong những tính năng thử nghiệm thú vị nhất của Ruby 4.0 là Ruby::Box , giới thiệu các không gian tên riêng biệt hoặc “vùng chứa” (đừng nhầm với vùng chứa Docker) bên trong các quy trình Ruby.
Về cơ bản, đây là một cách để tạo ra một thế giới Ruby biệt lập trong quy trình Ruby của bạn. Khi bạn tạo Ruby::Box mới , mọi lớp, mô-đun, biến toàn cục, hằng hoặc thậm chí phần mở rộng C mà bạn tải bên trong Hộp đó đều bị giới hạn trong đó.
Nó giống như ảo hóa nhẹ ở cấp độ ngôn ngữ, trong đó mỗi Hộp có trạng thái riêng và sẽ không rò rỉ định nghĩa sang các Hộp khác hoặc môi trường chính.
Vì chỉ mang tính thử nghiệm nên bạn có thể gặp phải các góc cạnh thô hoặc không ổn định. Chi phí hiệu suất là một điều cần cân nhắc. Việc cách ly mọi thứ không miễn phí nên nhóm nòng cốt đã cố tình chọn tham gia.
Kể từ Ruby 4.0, Box không nhằm mục đích cung cấp khả năng thực thi song song thực sự ngay lập tức. Chúng đặt nền tảng cho việc tải mã thông minh hơn và có thể phát triển thành thứ gì đó có ý nghĩa hơn. Tôi rất vui khi thấy Ruby phát triển theo cách thú vị như vậy. Nếu bạn muốn sử dụng Ruby Box, trước tiên bạn phải bật biến môi trường:
RUBY_BOX=1
Tại sao ZJIT lại quan trọng
Ruby 4.0 giới thiệu ZJIT, một trình biên dịch Just-In-Time hoàn toàn mới, được phát triển để kế thừa YJIT. Nếu bạn tiếp tục đếm thì MRI hiện có hai Trình biên dịch JIT. ZJIT khác với YJIT và chúng đang được phát triển song song. Nếu bạn đã sử dụng YJIT rồi thì bạn không cần phải chuyển đổi.
Tóm tắt YJIT
YJIT (“Yet Another JIT”) được Shopify xây dựng và giới thiệu trong Ruby 3.1. Nó sử dụng phương pháp Lập phiên bản khối cơ bản lười biếng—biên dịch nhanh các đoạn mã nhỏ (khối cơ bản) và chuyên biệt hóa chúng dựa trên các loại thời gian chạy.
YJIT đã được chứng minh là có thể tăng tốc đáng kể nhiều ứng dụng Ruby trong khi việc bổ sung tương đối dễ dàng. Nó được viết bằng Rust và là JIT mặc định/chính trong các phiên bản Ruby gần đây.
ZJIT khác biệt như thế nào
ZJIT sử dụng chiến lược JIT dựa trên phương pháp truyền thống hơn. Thay vì biên dịch các khối nhỏ từng phần, ZJIT biên dịch các đơn vị lớn hơn (toàn bộ phương thức hoặc đoạn mã lớn hơn) bằng cách sử dụng biểu diễn trung gian SSA (Gán đơn tĩnh) và quy trình biên dịch thông thường hơn.
Nó được thiết kế giống một trình biên dịch JIT “sách giáo khoa” hơn một chút, điều này sẽ giúp những người đóng góp dễ dàng hiểu và cải thiện hơn.
Nhóm cốt lõi của Ruby tuyên bố rõ ràng hai mục tiêu của họ với ZJIT là nâng cao mức trần hiệu suất dài hạn của Ruby (bằng cách cho phép tối ưu hóa nâng cao hơn YJIT có thể làm) và làm cho cộng đồng JIT dễ bị hack hơn.
Bật ZJIT trong Ruby 4.0
ZJIT có sẵn nhưng không được bật theo mặc định trong Ruby 4.0.
Để dùng thử, bạn cần xây dựng Ruby với cài đặt Rust 1.85 trở lên trên hệ thống của mình. Mặc dù mã JIT là một phần của mã nhị phân Ruby nhưng cần có Rust để xây dựng nó. Sau đó, bạn có thể chạy Ruby với cờ '--zjit' để sử dụng ZJIT.
Nếu bạn để JIT theo mặc định, bạn vẫn được hưởng lợi từ YJIT (bản thân nó vẫn tiếp tục được cải thiện). Nếu bạn đang sử dụng --rjit cờ, bạn sẽ nhận thấy nó đã bị xóa trong bản phát hành này.
Ruby 4 có một số cải tiến đối với Ractor
Ruby 3.0 đã giới thiệu Ractors, một tính năng thử nghiệm cho tính song song. Ractor cho phép chạy nhiều trình thông dịch Ruby (một phần của hệ thống thực thi mã của bạn) trong một quy trình duy nhất để hoạt động xung quanh GIL (Khóa phiên dịch toàn cầu), thường hạn chế Ruby ở một luồng duy nhất tại một thời điểm. Mặc dù tôi chưa bao giờ sử dụng Ractor nhưng việc tiếp tục đầu tư vào chúng là một dấu hiệu rõ ràng rằng chúng quan trọng đối với tương lai của Ruby.
Trong Ruby 4.0, Ractor vẫn vẫn được đánh dấu là thử nghiệm nhưng họ đã nhận được một số cải tiến lớn và thay đổi về API để đưa chúng đến gần hơn với khả năng sử dụng phổ biến.
Nếu bạn đã sử dụng Ractors, bạn sẽ biết rằng việc gửi và nhận tin nhắn hơi rắc rối. Ruby 4.0 thay thế API hiện có bằng Ractor::Port mạnh mẽ hơn cơ chế. Một Ractor::Port về cơ bản là một đường ống hoặc kênh mà Ractor có thể sử dụng để trao đổi giá trị. Mỗi Ractor hiện có một cổng mặc định (Ractor.current.default_port ) và bạn cũng có thể tạo các đối tượng Cổng tùy chỉnh và chuyển chúng đi khắp nơi.
Những thay đổi đối với Ractor cũng có nghĩa là có một số thay đổi đột phá. Đáng chú ý nhất là Ractor.yield và Ractor#take đã bị xóa.
Về cơ bản, việc triển khai Ractor của Ruby 4.0 đã được điều chỉnh để có hiệu suất và độ an toàn tốt hơn. Họ giảm trạng thái chia sẻ giữa các Ractor. Trạng thái ít được chia sẻ hơn giữa các Ractor có nghĩa là nguy cơ vô tình phá vỡ sự cô lập thấp hơn và sử dụng bộ đệm CPU tốt hơn trên các hệ thống đa lõi.
Ractor hiện nên mở rộng quy mô tốt hơn và chạy nhanh hơn, mặc dù chúng vẫn chưa được sử dụng rộng rãi như các luồng hoặc quy trình.
*.nil những thay đổi trong Ruby 4
Tách nil không gọi nil.to_a nữa trong Ruby 4.0.
Trong các phiên bản Ruby cũ hơn, thực hiện một cái gì đó như arr = [*nil] sẽ gọi nil.to_a hậu trường (trả về [] ), vì vậy bạn sẽ nhận được một mảng trống. Điều này hơi kỳ diệu và không nhất quán (tại sao *nil hoạt động như một mảng trống?).
Trong Ruby 4.0, hành vi kỳ lạ này không còn nữa. Sử dụng biểu tượng (* ) trên nil sẽ không gọi to_a . Về cơ bản, nó được coi là “không có gì để văng tung tóe”. Sự thay đổi này làm cho nó phù hợp với cách biểu tượng kép **nil không gọi nil.to_hash , được giới thiệu trong Ruby 3.4.
Toán tử logic ở đầu dòng trong Ruby 4
Đây là một cải tiến cú pháp khá nhỏ nhưng sẽ khiến nhiều Rubyist mỉm cười!
Bây giờ bạn có thể đặt && , || , and , hoặc or ở bắt đầu của một dòng để tiếp tục biểu thức boolean từ dòng trước đó. Ví dụ:bạn có thể viết:
if user_signed_in?
&& user.admin?
&& feature_enabled?
perform_admin_task
end
Điều này cũng giống như
if user_signed_in? &&
user.admin? &&
feature_enabled?
perform_admin_task
end
Tôi thấy hơi lạ khi những thứ này không giống nhau nên tôi rất vui vì bản cập nhật này.
Một số cập nhật về lớp trong Ruby 4
Ruby 4.0 cũng có một số thay đổi và cải tiến nhỏ hơn đối với các lớp cốt lõi.
Đầu tiên là Set lớp hiện là lớp lõi được tích hợp sẵn, nghĩa là bạn có thể sử dụng nó mà không cần require 'set' . Điều này đi kèm với việc loại bỏ set/sorted_set.rb .
Điều này hiện cũng đúng với Pathname , được thăng cấp lên lớp cốt lõi.
Ngoài ra còn có một số Array mới phương pháp! Bản phát hành này cải thiện hiệu suất của Array#find , tìm kiếm mảng thông minh hơn tìm kiếm tuyến tính đơn giản. Chúng tôi cũng đã giới thiệu Array#rfind - đó không phải là lỗi đánh máy! Phương thức này tìm thấy phần tử cuối cùng khớp với điều kiện trong mảng.
Ruby 4 còn bổ sung thêm một số phương pháp tính toán mới, kiểm soát nội tâm, Enumerator cải tiến và hơn thế nữa! Bạn chắc chắn nên xem tài liệu chính thức để biết danh sách đầy đủ các cải tiến.
Cách nâng cấp lên Ruby 4
Việc nâng cấp phiên bản Ruby trong ứng dụng sản xuất phải luôn được thực hiện cẩn thận, nhưng nếu bạn đang sử dụng Ruby 3.4 thì đây sẽ là một trong những nâng cấp dễ dàng hơn bạn đã trải nghiệm.
Dưới đây là một số mẹo để đảm bảo quá trình chuyển đổi an toàn:
Ghi chú phát hành
Đầu tiên, hãy đọc ghi chú phát hành chính thức! Kiểm tra kỹ các thông báo ngừng sử dụng chính thức. Có không nên có bất kỳ sự ngạc nhiên nào ở đây. Ruby 3.4 đáng lẽ phải cảnh báo bạn về bất kỳ sự ngừng sử dụng nào sắp tới.
Cảnh báo không dùng nữa
Nếu bạn đã bỏ qua các cảnh báo không dùng nữa từ trình thông dịch Ruby của mình, hãy giải quyết những cảnh báo đó trước khi cập nhật ngôn ngữ.
Thử nghiệm cơ bản
Tiếp theo, hãy chắc chắn rằng bạn có bài kiểm tra tốt. Điều này sẽ giúp bạn tạo niềm tin rằng hành vi của ứng dụng không thay đổi. Nếu bạn không có bất kỳ nào các cuộc thử nghiệm, bây giờ là thời điểm tuyệt vời để đầu tư vào các cuộc thử nghiệm để ít nhất cũng bao quát được những con đường quan trọng của bạn.
Cập nhật gói
Đó là một ý tưởng tốt để cập nhật gói tiếp theo. Khi bạn đã có phiên bản mới nhất, hãy chạy bundle install và kiểm tra lỗi hoặc cảnh báo.
Tăng phiên bản Ruby của bạn
Bây giờ bạn có thể cài đặt và chuyển sang phiên bản Ruby mới. Trình quản lý phiên bản Ruby như rbenv hoặc asdf phổ biến trong thế giới Ruby để kiểm soát phiên bản địa phương của bạn. Nếu ứng dụng của bạn chạy trong Docker, bạn sẽ muốn cập nhật phiên bản Ruby trong Dockerfile. Nếu ứng dụng của bạn chạy trên nền tảng nào đó không có Docker, bạn sẽ muốn cập nhật phiên bản Ruby của mình ở đó.
Nâng cấp lên Ruby 4.0 trong Gemfile của bạn
Cập nhật phiên bản Ruby của bạn trong Gemfile (nếu bạn khóa nó bằng ruby chỉ thị) và chạy bundle install một lần cuối cùng.
Chạy thử nghiệm của bạn
Cuối cùng, hãy chạy thử nghiệm của bạn! Nếu không có gì bị hỏng, hãy nhớ xem qua các đường dẫn quan trọng trong ứng dụng của bạn để tạo dựng sự tự tin hơn nữa. Trước khi gửi bản nâng cấp của mình, hãy cân nhắc sử dụng dịch vụ giám sát ngoại lệ như Honeybadger để bạn thực sự biết nếu việc nâng cấp lên Ruby 4 của bạn gây ra bất kỳ sự cố nào cho người dùng.
Nếu bạn làm theo các bước này, bạn sẽ có được trải nghiệm tương đối dễ dàng và luôn cập nhật những gì tốt nhất mà Ruby cung cấp. Khi bạn chạy những bài kiểm tra đó, đừng quên chúc Ruby sinh nhật lần thứ 30 vui vẻ nhé!