Phát hành Ruby 3.4.0
Đăng bởi naruse vào 25 Dec 2024
Chúng tôi vui mừng thông báo phát hành Ruby 3.4.0. Ruby 3.4 thêm tham chiếu tham số block it,
đổi Prism thành trình phân tích mặc định, thêm hỗ trợ Happy Eyeballs Version 2 cho thư viện socket, cải thiện YJIT,
thêm GC Mô-đun, và nhiều hơn nữa.
Giới thiệu it
it được thêm để tham chiếu đến tham số block không có tên biến. [Feature #18980]
ary = ["foo", "bar", "baz"]
p ary.map { it.upcase } #=> ["FOO", "BAR", "BAZ"]
it hoạt động rất giống với _1. Khi mục đích chỉ là sử dụng _1 trong một block, khả năng xuất hiện các tham số đánh số khác như _2 tạo thêm gánh nặng nhận thức cho người đọc. Vì vậy it được giới thiệu như một bí danh tiện lợi. Sử dụng it trong các trường hợp đơn giản khi it tự giải thích được, chẳng hạn trong các block một dòng.
Prism giờ đây là trình phân tích mặc định
Chuyển trình phân tích mặc định từ parse.y sang Prism. [Feature #20564]
Đây là một cải thiện nội bộ và người dùng sẽ thấy ít thay đổi. Nếu bạn phát hiện bất kỳ vấn đề tương thích nào, vui lòng báo cáo cho chúng tôi.
Để sử dụng trình phân tích truyền thống, sử dụng tham số dòng lệnh --parser=parse.y.
Thư viện socket giờ đây hỗ trợ Happy Eyeballs Version 2 (RFC 8305)
Thư viện socket giờ đây hỗ trợ Happy Eyeballs Version 2 (RFC 8305), phiên bản chuẩn hóa mới nhất của phương pháp được áp dụng rộng rãi để cải thiện kết nối trong nhiều ngôn ngữ lập trình, trong TCPSocket.new (TCPSocket.open) và Socket.tcp.
Cải thiện này cho phép Ruby cung cấp các kết nối mạng hiệu quả và đáng tin cậy, thích ứng với môi trường internet hiện đại.
Cho đến Ruby 3.3, các phương thức này thực hiện phân giải tên và nỗ lực kết nối tuần tự. Với thuật toán này, chúng giờ đây hoạt động như sau:
- Thực hiện phân giải tên IPv6 và IPv4 đồng thời
- Nỗ lực kết nối đến các địa chỉ IP đã phân giải, ưu tiên IPv6, với các nỗ lực song song cách nhau 250ms
- Trả về kết nối thành công đầu tiên trong khi hủy các kết nối khác
Điều này đảm bảo giảm thiểu độ trễ kết nối, ngay cả khi một giao thức hoặc địa chỉ IP cụ thể bị chậm hoặc không khả dụng.
Tính năng này được bật mặc định, vì vậy không cần cấu hình thêm để sử dụng. Để tắt toàn cục, đặt biến môi trường RUBY_TCP_NO_FAST_FALLBACK=1 hoặc gọi Socket.tcp_fast_fallback=false. Hoặc để tắt trên từng phương thức, sử dụng tham số keyword fast_fallback: false.
YJIT
TL;DR
- Hiệu suất tốt hơn trên hầu hết các benchmark trên cả nền tảng x86-64 và arm64.
- Giảm sử dụng bộ nhớ thông qua metadata nén và giới hạn bộ nhớ thống nhất.
- Nhiều bản sửa lỗi: YJIT giờ đây ổn định hơn và được kiểm tra kỹ hơn.
Tính năng mới
- Tùy chọn dòng lệnh
--yjit-mem-sizegiới thiệu giới hạn bộ nhớ thống nhất (mặc định 128MiB) để theo dõi tổng sử dụng bộ nhớ YJIT, cung cấp một phương án trực quan hơn so với tùy chọn cũ--yjit-exec-mem-size.--yjit-logbật nhật ký biên dịch để theo dõi những gì được biên dịch.
- Ruby API
RubyVM::YJIT.logcung cấp quyền truy cập vào phần cuối nhật ký biên dịch tại thời điểm chạy.
- Thống kê YJIT
RubyVM::YJIT.runtime_statsgiờ đây luôn cung cấp thêm thống kê về invalidation, inlining, và mã hóa metadata.
Tối ưu hóa mới
- Context nén giảm bộ nhớ cần thiết để lưu trữ metadata YJIT
- Cấp phát thanh ghi cho biến cục bộ và tham số phương thức Ruby
- Khi YJIT được bật, sử dụng nhiều nguyên thủy Core hơn được viết bằng Ruby:
Array#each,Array#select,Array#mapđược viết lại bằng Ruby để có hiệu suất tốt hơn [Feature #20182].
- Khả năng inline các phương thức nhỏ/đơn giản như:
- Phương thức rỗng
- Phương thức trả về hằng số
- Phương thức trả về
self - Phương thức trực tiếp trả về một tham số
- Codegen chuyên biệt cho nhiều phương thức runtime hơn
- Tối ưu hóa
String#getbyte,String#setbytevà các phương thức chuỗi khác - Tối ưu hóa các phép toán bitwise để tăng tốc thao tác bit/byte cấp thấp
- Hỗ trợ hằng số chia sẻ trong chế độ multi-ractor
- Nhiều tối ưu hóa gia tăng khác
GC Mô-đun
-
Các triển khai bộ thu gom rác (GC) thay thế có thể được tải động thông qua tính năng bộ thu gom rác mô-đun. Để bật tính năng này, cấu hình Ruby với
--with-modular-gckhi build. Các thư viện GC có thể được tải tại thời điểm chạy bằng biến môi trườngRUBY_GC_LIBRARY. [Feature #20351] -
Bộ thu gom rác tích hợp của Ruby đã được tách ra thành một tập tin riêng tại
gc/default/default.cvà tương tác với Ruby thông qua API được định nghĩa tronggc/gc_impl.h. Bộ thu gom rác tích hợp giờ đây cũng có thể được build dưới dạng thư viện bằngmake modular-gc MODULAR_GC=defaultvà được bật bằng biến môi trườngRUBY_GC_LIBRARY=default. [Feature #20470] -
Một thư viện GC thử nghiệm được cung cấp dựa trên MMTk. Thư viện GC này có thể được build bằng
make modular-gc MODULAR_GC=mmtkvà được bật bằng biến môi trườngRUBY_GC_LIBRARY=mmtk. Điều này yêu cầu bộ công cụ Rust trên máy build. [Feature #20860]
Thay đổi ngôn ngữ
-
Các chuỗi ký tự trong các tập tin không có comment
frozen_string_literalgiờ đây phát ra cảnh báo deprecation khi chúng bị thay đổi. Các cảnh báo này có thể được bật với-W:deprecatedhoặc bằng cách đặtWarning[:deprecated] = true. Để tắt thay đổi này, bạn có thể chạy Ruby với tham số dòng lệnh--disable-frozen-string-literal. [Feature #20205] -
Giờ đây hỗ trợ keyword splatting
nilkhi gọi phương thức.**nilđược xử lý tương tự như**{}, không truyền keyword nào, và không gọi bất kỳ phương thức chuyển đổi nào. [Bug #20064] -
Không còn cho phép truyền block trong index. [Bug #19918]
-
Không còn cho phép keyword arguments trong index. [Bug #20218]
-
Tên cấp cao nhất
::Rubygiờ đây được dành riêng, và định nghĩa sẽ bị cảnh báo khiWarning[:deprecated]. [Feature #20884]
Cập nhật các lớp lõi
Lưu ý: Chúng tôi chỉ liệt kê các cập nhật lớp lõi đáng chú ý.
-
Exception
Exception#set_backtracegiờ đây chấp nhận mảngThread::Backtrace::Location.Kernel#raise,Thread#raisevàFiber#raisecũng chấp nhận định dạng mới này. [Feature #13557]
-
GC
-
GC.configđược thêm để cho phép đặt các biến cấu hình trên Bộ thu gom rác. [Feature #20443] -
Tham số cấu hình GC
rgengc_allow_full_markđược giới thiệu. KhifalseGC sẽ chỉ đánh dấu các đối tượng trẻ. Mặc định làtrue. [Feature #20443]
-
-
Ractor
-
requiretrong Ractor được cho phép. Quá trình require sẽ được chạy trên Ractor chính.Ractor._require(feature)được thêm để chạy quá trình require trên Ractor chính. [Feature #20627] -
Ractor.main?được thêm. [Feature #20627] -
Ractor.[]vàRactor.[]=được thêm để truy cập bộ nhớ cục bộ ractor của Ractor hiện tại. [Feature #20715] -
Ractor.store_if_absent(key){ init }được thêm để khởi tạo biến cục bộ ractor một cách an toàn luồng. [Feature #20875]
-
-
Range
Range#sizegiờ đây némTypeErrornếu range không thể lặp. [Misc #18984]
Cập nhật thư viện chuẩn
Lưu ý: Chúng tôi chỉ liệt kê các cập nhật thư viện chuẩn đáng chú ý.
- RubyGems
- Thêm tùy chọn
--attestationcho gem push. Cho phép lưu chữ ký vào sigstore.dev
- Thêm tùy chọn
- Bundler
- Thêm cấu hình
lockfile_checksumsđể bao gồm checksum trong lockfile mới - Thêm bundle lock
--add-checksumsđể thêm checksum vào lockfile hiện có
- Thêm cấu hình
-
JSON
- Cải thiện hiệu suất
JSON.parsenhanh hơn khoảng 1.5 lần so với json-2.7.x.
- Cải thiện hiệu suất
-
Tempfile
- Tham số keyword
anonymous: trueđược triển khai cho Tempfile.create.Tempfile.create(anonymous: true)xóa tập tin tạm đã tạo ngay lập tức. Vì vậy ứng dụng không cần phải xóa tập tin. [Feature #20497]
- Tham số keyword
-
win32/sspi.rb
- Thư viện này giờ đây được tách ra từ kho Ruby vào ruby/net-http-sspi. [Feature #20775]
Các gem đi kèm sau đây được nâng cấp từ gem mặc định.
- mutex_m 0.3.0
- getoptlong 0.2.1
- base64 0.2.0
- bigdecimal 3.1.8
- observer 0.1.2
- abbrev 0.1.2
- resolv-replace 0.1.1
- rinda 0.2.0
- drb 2.2.1
- nkf 0.2.0
- syslog 0.2.0
- csv 3.3.2
- repl_type_completor 0.1.9
Vấn đề tương thích
Lưu ý: Không bao gồm các bản sửa lỗi tính năng.
- Thông báo lỗi và hiển thị backtrace đã được thay đổi.
- Sử dụng dấu nháy đơn thay vì dấu backtick làm dấu mở ngoặc. [Feature #16495]
- Hiển thị tên lớp trước tên phương thức (chỉ khi lớp có tên cố định). [Feature #19117]
Kernel#caller, các phương thức củaThread::Backtrace::Location, v.v. cũng được thay đổi tương ứng.
Old: test.rb:1:in `foo': undefined method `time' for an instance of Integer from test.rb:2:in `<main>' New: test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer from test.rb:2:in '<main>' -
Hiển thị Hash#inspect đã được thay đổi. [Bug #20433]
- Các khóa Symbol được hiển thị bằng cú pháp khóa symbol hiện đại:
"{user: 1}" - Các khóa khác giờ đây có khoảng trắng xung quanh
=>:'{"user" => 1}', trong khi trước đó không có:'{"user"=>1}'
- Các khóa Symbol được hiển thị bằng cú pháp khóa symbol hiện đại:
-
Kernel#Float() giờ đây chấp nhận chuỗi thập phân với phần thập phân bị bỏ qua. [Feature #20705]
Float("1.") #=> 1.0 (trước đây, ArgumentError được ném) Float("1.E-1") #=> 0.1 (trước đây, ArgumentError được ném) -
String#to_f giờ đây chấp nhận chuỗi thập phân với phần thập phân bị bỏ qua. Lưu ý rằng kết quả thay đổi khi chỉ định số mũ. [Feature #20705]
"1.".to_f #=> 1.0 "1.E-1".to_f #=> 0.1 (trước đây, 1.0 được trả về) - Refinement#refined_class đã được loại bỏ. [Feature #19714]
Vấn đề tương thích thư viện chuẩn
-
DidYouMean
DidYouMean::SPELL_CHECKERS[]=vàDidYouMean::SPELL_CHECKERS.merge!được loại bỏ.
-
Net::HTTP
- Loại bỏ các hằng số deprecated sau:
Net::HTTP::ProxyModNet::NetPrivate::HTTPRequestNet::HTTPInformationCodeNet::HTTPSuccessCodeNet::HTTPRedirectionCodeNet::HTTPRetriableCodeNet::HTTPClientErrorCodeNet::HTTPFatalErrorCodeNet::HTTPServerErrorCodeNet::HTTPResponseReceiverNet::HTTPResponceReceiver
Các hằng số này đã bị deprecated từ năm 2012.
- Loại bỏ các hằng số deprecated sau:
-
Timeout
- Từ chối giá trị âm cho Timeout.timeout. [Bug #20795]
-
URI
- Chuyển trình phân tích mặc định sang tuân thủ RFC 3986 thay vì tuân thủ RFC 2396. [Bug #19266]
Cập nhật C API
rb_newobjvàrb_newobj_of(và các macro tương ứngRB_NEWOBJ,RB_NEWOBJ_OF,NEWOBJ,NEWOBJ_OF) đã được loại bỏ. [Feature #20265]- Loại bỏ hàm deprecated
rb_gc_force_recycle. [Feature #18290]
Thay đổi khác
-
Truyền block cho một phương thức không sử dụng block đã truyền sẽ hiển thị cảnh báo ở chế độ verbose (
-w). [Feature #15554] -
Định nghĩa lại một số phương thức lõi được tối ưu hóa đặc biệt bởi trình thông dịch và JIT như
String.freezehoặcInteger#+giờ đây sẽ phát ra cảnh báo hiệu suất (-W:performancehoặcWarning[:performance] = true). [Feature #20429]
Xem NEWS hoặc nhật ký commit để biết thêm chi tiết.
Với những thay đổi đó, 4942 tập tin thay đổi, 202244 thêm vào(+), 255528 xóa đi(-) kể từ Ruby 3.3.0!
Giáng sinh vui vẻ, Chúc mừng ngày lễ, và hãy tận hưởng lập trình với Ruby 3.4!
Tải về
-
https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.gz
SIZE: 23153022 SHA1: 8ccb561848a7c460ae08e1a120a47c4a88a79335 SHA256: 068c8523442174bd3400e786f4a6952352c82b1b9f6210fd17fb4823086d3379 SHA512: bc70ecba27d1cdea00879f03487cad137a7d9ab2ad376cfb7a65780ad14da637fa3944eeeede2c04ab31eeafb970c64ccfeeb854c99c1093937ecc1165731562 -
https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.xz
SIZE: 17215572 SHA1: eb25447cc404e8d2e177c62550d0224ebd410e68 SHA256: 0081930db22121eb997207f56c0e22720d4f5d21264b5907693f516c32f233ca SHA512: 776a2cf3e9ccc77c27500240f168aa3e996b0c7c1ee1ef5a7afc291a06c118444016fde38b5b139c0b800496b8eb1b5456562d833f0edc0658917164763b1af7 -
https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.zip
SIZE: 28310193 SHA1: 26254ca5d3decc28a4e5faec255995265e5270b5 SHA256: c120228038af04554f6363e716b0a32cbf53cf63c6adf9f2c22a24f43dc8b555 SHA512: 4d535ed10db76a6aa74f8a025df319deb28483a7a781c24045906ee7663f1cff9d9f9e71dbc993c9e050113a34b37c7fa2143c355a0a6e1e1029bf2c92213ecc
Ruby là gì
Ruby được phát triển lần đầu bởi Matz (Yukihiro Matsumoto) vào năm 1993, và hiện được phát triển dưới dạng Mã nguồn Mở. Nó chạy trên nhiều nền tảng và được sử dụng trên toàn thế giới, đặc biệt cho phát triển web.
Tin mới nhất
Phát hành Ruby 3.2.10
Ruby 3.2.10 đã được phát hành.
Đăng bởi hsbt vào 14 Jan 2026
Phát hành Ruby 4.0.1
Ruby 4.0.1 đã được phát hành.
Đăng bởi k0kubun vào 13 Jan 2026
Phát hành Ruby 4.0.0
Chúng tôi vui mừng thông báo phát hành Ruby 4.0.0. Ruby 4.0 giới thiệu “Ruby Box” và “ZJIT”, cùng nhiều cải tiến khác.
Đăng bởi naruse vào 25 Dec 2025
Diện mạo mới cho tài liệu Ruby
Tiếp theo việc thiết kế lại ruby-lang.org, chúng tôi có thêm tin vui để kỷ niệm 30 năm Ruby: docs.ruby-lang.org có diện mạo hoàn toàn...
Đăng bởi Stan Lo vào 23 Dec 2025