Ruby không bao giờ ngừng cải tiến!
Phiên bản 2.7 đã có mặt với tính năng mới, phương thức & cải tiến hiệu suất. Nó được phát hành vào ngày 25 tháng 12, 2019.
Bây giờ, theo Matz…
Đây là bản phát hành 2.x cuối cùng. Vì năm sau chúng ta sẽ có Ruby 3.0!
Nhưng trước khi đến đó…
Hãy nhìn vào một số thay đổi & tính năng mới trong 2.7, để bạn sẵn sàng cho bản cập nhật phiên bản.
Nội Dung
- 1 Enumerable#tally
- 2 Numbered Parameters For Blocks [Experimental]
- 3 Array#intersection
- 4 Enumerable#filter_map
- 5 Enumerator#produce
- 6 IRB Được Làm Đẹp Lại?
- 7 Ruby Pattern Matching [Experimental]
- 8 Thay Đổi Khác
- 9 Tóm Tắt
- 9.1 Related
Enumerable#tally
Đây là phương thức Ruby mới đếm tất cả phần tử trong mảng & trả về hash với số lượng của chúng.
Bạn có thể tự làm điều này, nhưng phương thức tally này giúp bạn đỡ công việc.
Ví dụ:
%w(a a a b b c).tally
Kết quả là:
{"a"=>3, "b"=>2, "c"=>1}
Tôi thích nó!
Numbered Parameters For Blocks [Experimental]
Một tính năng mới thú vị, mà tôi đã mong đợi một thời gian, là tên mặc định cho tham số block.
Ví dụ block thường, với một tham số:
[1,2,3].each { |n| puts n }
|n| này là tham số, bạn phải định nghĩa để dùng nó.
Nhưng nếu chúng ta có tên mặc định?
Vâng, đó là một trong những thứ ngon Ruby 2.7 mang lại, dù là tính năng thử nghiệm, nó có thể tiết kiệm nhiều gõ phím.
Trông như sau:
[1,2,3].each { puts _1 }
Nơi _1 tham chiếu đến tham số đầu tiên, bạn có thể dùng _2 nếu có tham số thứ 2, và có, _3 cho tham số thứ 3, v.v.
Rất cool!
Bây giờ, chút trivia.
Tính năng này đầu tiên được đề xuất trông như @1, nhưng trông quá giống biến instance, nên sau thảo luận, quyết định dùng _1 thay vào đó.
Array#intersection
Đây là phương thức mới, nhưng không phải chức năng mới.
Thực tế…
Điều này giống như một alias!
Ruby 2.6 giới thiệu phương thức Array union & difference, để khớp với các phiên bản ngắn gọn hơn của Array#|, và Array#-.
Nhưng phép toán còn thiếu là intersection, có phiên bản ngắn khó nhớ khác.
Phương thức Array#&.
Bây giờ:
Các phương thức này làm gì & hoạt động như thế nào?
Ví dụ:
[1, 2, 3].intersection([2, 3, 4]) # [2, 3] [1, 2, 3] & [2, 3, 4] # [2, 3]
Vâng…
Tên nói lên tất cả, intersection tìm giao giữa hai mảng. Nói cách khác, tìm phần tử chung.
| Phiên Bản Ngắn | Phiên Bản Dài |
|---|---|
| & | intersection |
| | | union |
| - | difference |
Tôi luôn quên cái nào trong 3 phương thức này làm gì!
Nhưng với các phương thức mới này, nó dễ nhớ hơn nhiều vì tên của chúng có ý nghĩa.
Đó là bài học tốt viết code tốt, btw.
Enumerable#filter_map
Phương thức filter_map này là cố gắng kết hợp phương thức select & map thành một.
Tại sao?
Vì lọc danh sách trước, sau đó map các phần tử còn lại là thao tác phổ biến.
Bạn có thể làm theo hai cách:
(1..8).select(&:even?).map { |n| n ** 2 }
# OR
(1..8).map { |n| n ** 2 if n.even? }.compact
Tôi đã dùng cả hai, nhưng tôi có xu hướng nghiêng về cái đầu vì ý định rõ ràng hơn.
Bây giờ:
Trong Ruby 2.7, phương thức filter_map này làm điều đó trong một lượt.
Như sau:
(1..8).filter_map { |n| n ** 2 if n.even? } # [4, 16, 36, 64]
Tôi không phải fan lớn của câu if bên trong block, nhưng đôi khi chúng cần thiết để hoàn thành việc.
Bên cạnh đó, có điều bạn nên biết.
Hoạt động filter_map không hoạt động như map + compact, vì nó loại bỏ đối tượng false, và compact không làm vậy.
Điều tốt để ghi nhớ!
Enumerator#produce
Đây là phương thức mới khác bạn có thể thấy thú vị, nhưng có thể yêu cầu sự sáng tạo để tận dụng tối đa.
Đó là phương thức Enumerator#produce.
Nó làm gì?
Theo đề xuất tính năng:
„Phương thức này tạo ra chuỗi vô hạn nơi mỗi phần tử tiếp theo được tính bằng cách áp dụng block cho phần tử trước.“
Ừ.
Cách khác tạo chuỗi không bao giờ kết thúc!
Ví dụ:
Enumerator.produce(1, &:next).take(5) # [1, 2, 3, 4, 5]
Trong ví dụ này, không quan trọng bạn làm take(10) hay take(10_000), bạn sẽ nhận được vô hạn giá trị từ nó.
Btw, 1 là giá trị khởi tạo.
Và &:next là phương thức được gọi trên giá trị đó để produce phần tử tiếp theo trong chuỗi.
IRB Được Làm Đẹp Lại?
Gần đây, IRB đã nhận được sự quan tâm & chú ý, và Ruby 2.7 tiếp tục thêm vào đó.
Chúng ta nhận được:
- Chỉnh sửa nhiều dòng (Multi-line editing)
- Tô màu cú pháp (Syntax Highlighting)
- Tích hợp RDoc tích hợp sẵn
- Lịch sử lệnh bật mặc định
- Tự động hoàn thành bật mặc định
Thực tế:
Đây là thay đổi LỚN đến nỗi bạn nhận cảnh báo khi khởi động irb với Ruby 2.7.
Nếu bạn muốn giữ phiên bản irb cũ, bạn vẫn có thể, với lệnh irb --legacy. Vấn đề chính của tôi với IRB mới là chỉnh sửa dòng, trong IRB legacy (hoặc Pry) tôi có thể giữ ALT & nhấn mũi tên trái để di chuyển nhanh hơn, nhưng điều này không hoạt động trong IRB mới.
Hãy thử & xem nó hoạt động như thế nào cho bạn.
Ruby Pattern Matching [Experimental]
Một tính năng thường được yêu cầu sẽ đến trong 2.7 là pattern matching (khớp mẫu).
Nó được đánh dấu là thử nghiệm.
Nhưng pattern matching là gì & nó có lợi ích gì cho bạn?
Vâng, nếu tôi hiểu đúng, pattern matching giống như biểu thức chính quy, nhưng cho cấu trúc dữ liệu (Array/Hash).
Ví dụ:
[1,2,3] in [a,b,c] # true [1,2,3] in [a] # false
Nếu có khớp, các tên biến này (như a) trở thành biến cục bộ bạn có thể truy cập.
Ví dụ với hash:
{ a: 1, b: 2, c: [] } in { a: a, b: b, c: [] } # true
p a # 1
Điều này dùng từ khóa in.
Nó không mới, nhưng ít dùng vì trước Ruby 2.7 in chỉ dùng như một phần của vòng lặp for (rất không khuyến khích trong Ruby), nên chúng ta tái sử dụng từ khóa này cho việc hữu ích.
Tuyệt hơn nữa…
Không quan trọng bạn dùng biến nào, a,b,c ở đây hoạt động, nhưng f,g,h cũng hoạt động.
Đó là tất cả về mẫu (pattern)!
Thay Đổi Khác
Một vài thay đổi thêm đáng nhắc.
- GC compaction mới cải thiện phân mảnh bộ nhớ
- Tham số phương thức
**nilgiờ khai báo phương thức không nhận keyword - Tham số phương thức
...thêm cơ chế chuyển tiếp đối số (yêu cầu dấu ngoặc, nhưmake_salad(...)) - Cải tiến Fiber. Pool đối tượng fiber mới (từ đó fiber mới được cấp phát) làm fiber hiệu quả hơn
- Cải tiến Thread. Cách tốt hơn, tối ưu hơn tạo thread làm đa luồng nhanh hơn
Bạn nghĩ sao về những điều này?
Tệp NEWS cho 2.7 nhắc đến cải tiến hiệu suất 10x cho cả tạo fiber & thread, tôi chưa tự test, nhưng nếu bạn làm hãy cho tôi biết kết quả.
Tóm Tắt
Bây giờ bạn đã cập nhật các thay đổi mới nhất cho ngôn ngữ lập trình Ruby! Bạn học về thay đổi IRB, phương thức mới & một vài tính năng thử nghiệm như pattern matching.
Vui lòng chia sẻ bài viết này để lan tỏa tin tức!
Cảm ơn bạn đã đọc 🙂