Ruby 2.7.0-preview3 đã được phát hành
Đăng bởi naruse vào 23 Nov 2019
Chúng tôi vui mừng thông báo phiên bản Ruby 2.7.0-preview3 đã được phát hành.
Phiên bản preview được phát hành để thu thập phản hồi cho phiên bản chính thức dự kiến phát hành vào tháng 12. Phiên bản preview3 này chủ yếu được phát hành để xác nhận tính tương thích của tham số từ khóa.
Phiên bản này cũng giới thiệu một số tính năng mới và cải thiện hiệu suất, đáng chú ý nhất là:
- GC nén
- Pattern Matching
- Cải thiện REPL
- Tách biệt tham số vị trí và tham số từ khóa
GC nén
Phiên bản này giới thiệu GC nén, có thể chống phân mảnh vùng nhớ bị phân mảnh.
Một số chương trình Ruby đa luồng có thể gây ra phân mảnh bộ nhớ, dẫn đến việc sử dụng bộ nhớ cao và tốc độ giảm.
Phương thức GC.compact được giới thiệu để nén heap.
Hàm này nén các đối tượng còn sống trong heap để có thể sử dụng ít trang hơn,
và heap có thể thân thiện hơn với CoW.
[Feature #15626]
Pattern Matching [Thử nghiệm]
Pattern Matching, tính năng được sử dụng rộng rãi trong các ngôn ngữ lập trình hàm, được giới thiệu như một tính năng thử nghiệm. [Feature #14912]
Nó có thể duyệt qua một đối tượng cho trước và gán giá trị của nó nếu khớp với một mẫu.
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
Để biết thêm chi tiết, vui lòng xem Pattern matching - New feature in Ruby 2.7.
Cải thiện REPL
irb, môi trường tương tác đi kèm (REPL; Read-Eval-Print-Loop),
giờ đã hỗ trợ chỉnh sửa đa dòng. Nó được cung cấp bởi reline,
một triển khai thuần Ruby tương thích với readline.
Nó cũng cung cấp tích hợp rdoc. Trong irb bạn có thể hiển thị tài liệu
tham khảo cho một lớp, module, hoặc phương thức cho trước.
[Feature #14683],
[Feature #14787],
[Feature #14918]
Ngoài ra, các dòng mã nguồn hiển thị tại binding.irb và kết quả inspect
cho các đối tượng lớp cốt lõi giờ đã được tô màu.
Tách biệt tham số vị trí và tham số từ khóa
Việc chuyển đổi tự động giữa tham số từ khóa và tham số vị trí đã bị deprecated, và việc chuyển đổi sẽ bị loại bỏ trong Ruby 3. [Feature #14183]
-
Khi một lời gọi phương thức truyền một Hash ở tham số cuối cùng, và khi nó không truyền từ khóa nào, và khi phương thức được gọi chấp nhận từ khóa, một cảnh báo sẽ được đưa ra. Để tiếp tục xử lý hash như từ khóa, thêm toán tử double splat để tránh cảnh báo và đảm bảo hành vi đúng trong Ruby 3.
def foo(key: 42); end; foo({key: 42}) # warned def foo(**kw); end; foo({key: 42}) # warned def foo(key: 42); end; foo(**{key: 42}) # OK def foo(**kw); end; foo(**{key: 42}) # OK -
Khi một lời gọi phương thức truyền từ khóa cho một phương thức chấp nhận từ khóa, nhưng nó không truyền đủ tham số vị trí bắt buộc, các từ khóa được xử lý như một tham số vị trí bắt buộc cuối cùng, và một cảnh báo sẽ được đưa ra. Truyền tham số dưới dạng hash thay vì từ khóa để tránh cảnh báo và đảm bảo hành vi đúng trong Ruby 3.
def foo(h, **kw); end; foo(key: 42) # warned def foo(h, key: 42); end; foo(key: 42) # warned def foo(h, **kw); end; foo({key: 42}) # OK def foo(h, key: 42); end; foo({key: 42}) # OK -
Khi một phương thức chấp nhận các từ khóa cụ thể nhưng không chấp nhận keyword splat, và một hash hoặc keywords splat được truyền cho phương thức bao gồm cả khóa Symbol và không phải Symbol, hash sẽ tiếp tục được tách ra, và một cảnh báo sẽ được đưa ra. Bạn sẽ cần cập nhật mã gọi để truyền các hash riêng biệt nhằm đảm bảo hành vi đúng trong Ruby 3.
def foo(h={}, key: 42); end; foo("key" => 43, key: 42) # warned def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK -
Nếu một phương thức không chấp nhận từ khóa, và được gọi với từ khóa, các từ khóa vẫn được xử lý như một hash vị trí, không có cảnh báo. Hành vi này sẽ tiếp tục hoạt động trong Ruby 3.
def foo(opt={}); end; foo( key: 42 ) # OK -
Các ký tự không phải symbol được cho phép làm khóa tham số từ khóa nếu phương thức chấp nhận từ khóa tùy ý. [Feature #14183]
def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1} -
**nilđược cho phép trong định nghĩa phương thức để đánh dấu rõ ràng rằng phương thức không chấp nhận từ khóa. Gọi phương thức như vậy với từ khóa sẽ dẫn đến ArgumentError. [Feature #14183]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 -
Truyền một keyword splat rỗng cho một phương thức không chấp nhận từ khóa không còn truyền một hash rỗng nữa, trừ khi hash rỗng là cần thiết cho một tham số bắt buộc, trong trường hợp đó một cảnh báo sẽ được đưa ra. Loại bỏ double splat để tiếp tục truyền một hash vị trí. [Feature #14183]
h = {}; def foo(*a) a end; foo(**h) # [] h = {}; def foo(a) a end; foo(**h) # {} and warning h = {}; def foo(*a) a end; foo(h) # [{}] h = {}; def foo(a) a end; foo(h) # {}
LƯU Ý: Quá nhiều cảnh báo deprecation về sự không tương thích của tham số từ khóa đã được chỉ ra là quá dài dòng. Hiện tại, hai giải pháp khả thi đang được thảo luận; tắt cảnh báo deprecation theo mặc định (#16345) hoặc chặn các cảnh báo trùng lặp (#16289). Quyết định cuối cùng chưa được đưa ra, nhưng sẽ được sửa trước phiên bản chính thức.
Các tính năng mới đáng chú ý khác
-
Toán tử tham chiếu phương thức,
.:, đã được giới thiệu như một tính năng thử nghiệm trong các bản preview trước, nhưng đã được hoàn tác. [Feature #12125], [Feature #13581], [Feature #16275] -
Tham số đánh số làm tham số block mặc định được giới thiệu như một tính năng thử nghiệm. [Feature #4475]
-
Range không có điểm đầu được giới thiệu dưới dạng thử nghiệm. Nó có thể không hữu ích bằng range không có điểm cuối, nhưng sẽ tốt cho mục đích DSL. [Feature #14799]
ary[..3] # identical to ary[0..3] rel.where(sales: ..100) -
Enumerable#tallyđược thêm vào. Nó đếm số lần xuất hiện của mỗi phần tử.["a", "b", "c", "b"].tally #=> {"a"=>1, "b"=>2, "c"=>1} -
Gọi phương thức private trên
selfgiờ đã được cho phép. [Feature #11297], [Feature #16123]def foo end private :foo self.foo -
Enumerator::Lazy#eagerđược thêm vào. Nó tạo ra một enumerator không lazy từ một lazy enumerator. [Feature #15901]a = %w(foo bar baz) e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager p e.class #=> Enumerator p e.map {|x| x + "?" } #=> ["FOO!?", "BAR!?", "BAZ!?"]
Cải thiện hiệu suất
-
JIT [Thử nghiệm]
-
Mã JIT được biên dịch lại thành mã ít tối ưu hơn khi một giả định tối ưu hóa bị vô hiệu.
-
Method inlining được thực hiện khi một phương thức được coi là thuần túy. Tối ưu hóa này vẫn đang thử nghiệm và nhiều phương thức chưa được coi là thuần túy.
-
Giá trị mặc định của
--jit-min-callsđược thay đổi từ 5 thành 10.000. -
Giá trị mặc định của
--jit-max-cacheđược thay đổi từ 1.000 thành 100.
-
-
(đã hoàn tác),Symbol#to_sModule#name,true.to_s,false.to_s, vànil.to_sgiờ luôn trả về một String đóng băng. String được trả về luôn giống nhau cho một đối tượng cho trước. [Thử nghiệm] [Feature #16150] -
Hiệu suất của
CGI.escapeHTMLđã được cải thiện. GH-2226 -
Hiệu suất của Monitor và MonitorMixin đã được cải thiện. [Feature #16255]
Các thay đổi đáng chú ý khác kể từ 2.6
- Một số thư viện chuẩn đã được cập nhật.
- Nâng cấp stdlib thành default gems
- Các default gems sau đã được xuất bản trên rubygems.org
- benchmark
- cgi
- delegate
- getoptlong
- net-pop
- net-smtp
- open3
- pstore
- singleton
- Các default gems sau chỉ được nâng cấp tại ruby-core,
nhưng chưa được xuất bản trên rubygems.org.
- monitor
- observer
- timeout
- tracer
- uri
- yaml
- Các default gems sau đã được xuất bản trên rubygems.org
-
Proc.newvàprockhông có block trong một phương thức được gọi với block giờ sẽ đưa ra cảnh báo. -
lambdakhông có block trong một phương thức được gọi với block sẽ báo lỗi. -
Cập nhật phiên bản Unicode và Emoji từ 11.0.0 lên 12.0.0. [Feature #15321]
-
Cập nhật phiên bản Unicode lên 12.1.0, thêm hỗ trợ cho U+32FF SQUARE ERA NAME REIWA. [Feature #15195]
-
Date.jisx0301,Date#jisx0301, vàDate.parsehỗ trợ niên hiệu mới của Nhật Bản. [Feature #15742] - Yêu cầu trình biên dịch hỗ trợ C99
[Misc #15347]
- Chi tiết về phương ngữ của chúng tôi: https://bugs.ruby-lang.org/projects/ruby-master/wiki/C99
đã hoàn tácRegexp#match{?}vớinilsẽ raise TypeError như String, Symbol. [Feature #13083]
3895 tệp đã thay đổi, 213426 dòng thêm(+), 96934 dòng xóa(-)
Xem NEWS hoặc nhật ký commit để biết thêm chi tiết.
Với những thay đổi đó, thống kê kể từ Ruby 2.6.0!
Hãy tận hưởng lập trình với Ruby 2.7!
Tải về
-
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.bz2
SIZE: 14630824 SHA1: 1fa35d8a26dfc814e92fa259095f4cf70f386f87 SHA256: df2ddee659873e6fc30a8590ecffa49cf3a4ef81fa922b0d09f821b69ee88bc3 SHA512: 5d8e99e3fd984c7d05c0bc483e1504e81ccdb920cbb2d78cad3c314e197b30316b692fd0199f836acac41246e3a713cb81dc6dd64c27cba56f807df4c193db1a -
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.gz
SIZE: 16723536 SHA1: 7554926ee29a344da4b53d67fc296d70fdbe60ca SHA256: 9baa1f5096ebc2a0923df628d7dc7105da3789c1bf8b873469d9010249736b00 SHA512: 8fad3e761fd54036fee974a9f33e4db31d9a8a878b1181a08724388f5a1da548ab249136356f675797e9c43b565777bf22e6a419db1364336f134b31f4e75b33 -
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.tar.xz
SIZE: 11923988 SHA1: f3c54538915483e5ddc714ac23414e7c47048b12 SHA256: ad9d61e55ac224e3447a762e001965839846f9658f87a0e792840887cfe61b8c SHA512: 2b6844f34d32f1013dc3110043e6ece33a083b20f1343dea9a14311bda0017e8f56fc7d73be1616999b22ce430d7ba59a77bb0892d27c6d1ec243c3860086133 -
https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview3.zip
SIZE: 20691541 SHA1: d18b494cda4db751d8b3f5026404e348f3f682e3 SHA256: 2bc95f67f271b6a41fc3dd40536705b4a7974df8a2fa33ff0758a60822291781 SHA512: af9f728aebc53693cbd9f78a632c82e851e9f83dfc0c53979fdc37c627b11482c8435ce12dbb1d5a7253e998ea989759be699e6a00aae18384d2d765650cb0d7
Ruby là gì
Ruby được phát triển đầu tiên 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