Computer >> Máy Tính >  >> Lập trình >> Ruby

Các tính năng, phương pháp &cải tiến mới trong Ruby 2.7

Ruby không ngừng cải thiện!

Phiên bản 2.7 đã ra mắt với các tính năng, phương pháp và cải tiến hiệu suất mới. Nó được phát hành vào ngày 25 tháng 12 năm 2019.

Bây giờ, theo Matz…

Đây là bản phát hành phiên bản 2.x cuối cùng. Bởi vì năm sau chúng tôi sẽ nhận được Ruby 3.0!

Nhưng trước khi chúng ta đến đó…

Hãy cùng xem qua một số thay đổi và tính năng mới trong 2.7 để bạn có thể sẵn sàng cập nhật phiên bản.

Nội dung

  • 1 Enumerable # tally
  • 2 tham số được đánh số cho khối [Thử nghiệm]
  • 3 Giao điểm của mảng #
  • 4 # filter_map có thể liệt kê
  • 5 Điều tra viên # sản xuất
  • 6 IRB được Nâng cơ khuôn mặt?
  • 7 Đối sánh Mẫu Ruby [Thử nghiệm]
  • 8 Thay đổi Khác
  • 9 Tóm tắt
    • 9.1 Có liên quan

Enumerable # tally

Đây là một phương thức Ruby mới để đếm tất cả các phần tử trong một mảng và trả về một hàm băm với số lượng của chúng.

Bạn có thể tự làm điều này, nhưng tally này phương pháp giúp bạn tiết kiệm công việc.

Đây là một ví dụ :

% w (a a a b b c) .tally 

Kết quả nào dẫn đến :

 {"a" => 3, "b" => 2, "c" => 1} 

Tôi thích nó!

Tham số được đánh số cho khối [Thử nghiệm]

Một tính năng mới thú vị mà tôi đã mong đợi từ lâu, là tên mặc định cho các tham số khối.

Đây là một khối thông thường, với một tham số :

 [1,2,3] .each {| n | đặt n} 

|n| này là tham số mà bạn phải xác định để sử dụng nó.

Nhưng điều gì sẽ xảy ra nếu chúng tôi có tên mặc định?

Chà, đó là một trong những tính năng tốt mà Ruby 2.7 mang lại, mặc dù là một tính năng thử nghiệm , nó có thể giúp chúng tôi tiết kiệm rất nhiều công việc đánh máy.

Đây là những gì nó trông như thế nào :

 [1,2,3] .each {put _1} 

Ở đâu _1 đề cập đến tham số đầu tiên, bạn có thể sử dụng _2 nếu bạn có cái thứ hai và có, _3 cho tham số thứ 3, v.v.

Khá tuyệt!

Bây giờ, một chút đố vui.

Tính năng này lần đầu tiên được đề xuất trông giống như @1 , nhưng điều đó trông quá giống một biến phiên bản, vì vậy sau một số cuộc thảo luận, nó đã được giải quyết bằng cách sử dụng _1 thay vào đó.

Mảng # giao nhau

Đây là một phương pháp mới, nhưng không phải là chức năng mới.

Trên thực tế…

Đây giống như một bí danh hơn!

Ruby 2.6 đã giới thiệu Array union &difference để so khớp các phương thức tương đương ngắn gọn hơn của Array#|Array#- .

Nhưng thao tác bị thiếu là intersection , có một phiên bản ngắn khó nhớ khác.

Array#& method .

Bây giờ :

Những phương pháp này làm gì và chúng 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]  

Chà…

Loại tên mang lại cho nó, intersection tìm giao điểm giữa hai mảng. Nói cách khác, nó tìm thấy những yếu tố nào có điểm chung.

Phiên bản ngắn Phiên bản Dài
& giao lộ
| union
- chênh lệch

Tôi luôn quên rằng một trong 3 phương pháp này có tác dụng gì!

Nhưng với những phương pháp mới này, sẽ dễ nhớ hơn rất nhiều bởi vì tên của họ có ý nghĩa gì đó .

Đó là một bài học tốt để viết mã tốt, btw.

Có thể liệt kê # filter_map

filter_map này phương pháp là một nỗ lực để kết hợp select &map các phương thức thành một.

Tại sao?

Bởi vì đây là một thao tác phổ biến để lọc danh sách trước, sau đó ánh xạ các phần tử còn lại.

Bạn có thể thực hiện việc này theo hai cách :

 (1..8) .select (&:Even?). map {| n | n ** 2} # OR (1..8) .map {| n | n ** 2 nếu n.even? } .compact 

Tôi đã sử dụng cả hai, nhưng tôi có xu hướng nghiêng về cái đầu tiên vì ý định rõ ràng hơn.

Bây giờ :

Trong Ruby 2.7, filter_map này phương thức này thực hiện một lần.

Như thế này :

 (1..8) .filter_map {| n | n ** 2 nếu n.even? } # [4, 16, 36, 64] 

Tôi không phải là người thích nhất có câu lệnh if bên trong các khối, nhưng đôi khi chúng cần thiết để hoàn thành công việc.

Ngoài điều đó, có một số điều bạn nên biết.

filter_map hoạt động không hoạt động giống như map + compact , vì nó loại bỏ false đối tượng và compact không.

Một điều tốt cần ghi nhớ!

Điều tra viên # sản xuất

Đây là một phương pháp mới khác mà bạn có thể thấy thú vị, nhưng nó có thể đòi hỏi một số sáng tạo để tận dụng tối đa.

Đó là Enumerator#produce phương pháp.

Nó làm gì?

Theo đề xuất tính năng :

“Phương pháp này tạo ra một chuỗi vô hạn trong đó mỗi phần tử tiếp theo được tính bằng cách áp dụng khối cho phần tử trước đó.”

Đúng.

Một cách khác để tạo chuỗi không bao giờ kết thúc!

Đây là một ví dụ :

 Enumerator.produce (1, &:next) .take (5) # [1, 2, 3, 4, 5] 

Trong ví dụ này, không thành vấn đề nếu bạn thực hiện take(10) hoặc take(10_000) , bạn sẽ nhận được vô số giá trị từ nó.

Btw, 1 là giá trị ban đầu.

&: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 Nâng cơ mặt?

Gần đây, IRB đã nhận được một số tình yêu và sự chú ý, và Ruby 2.7 tiếp tục thêm vào đó.

Chúng tôi đang nhận được :

  • Chỉnh sửa nhiều dòng
  • Đánh dấu cú pháp
  • Tích hợp RDoc tích hợp
  • Lịch sử lệnh được bật theo mặc định
  • Tính năng tự động hoàn thành được bật theo mặc định

Thực tế :

Đây là một thay đổi LỚN đến nỗi bạn sẽ nhận được cảnh báo khi khởi động irb với Ruby 2.7.

Nếu bạn muốn tiếp tục sử dụng phiên bản cũ của irb, bạn vẫn có thể, với irb --legacy yêu cầu. Vấn đề chính của tôi với IRB mới này là chỉnh sửa dòng, trong IRB cũ (hoặc trong Pry), tôi có thể giữ ALT và 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ử và xem nó hoạt động như thế nào đối với bạn.

Đối sánh mẫu Ruby [Thử nghiệm]

Một tính năng thường được yêu cầu trong phiên bản 2.7 là đối sánh mẫu.

Nó được đánh dấu là thử nghiệm.

Nhưng đối sánh mẫu là gì và nó mang lại lợi ích cho bạn như thế nào?

Chà, nếu tôi hiểu điều này một cách chính xác, thì đối sánh mẫu giống như biểu thức chính quy, nhưng đối với cấu trúc dữ liệu (Mảng / Hash).

Đây là một ví dụ :

 [1,2,3] in [a, b, c] # true [1,2,3] in [a] # false 

Nếu có sự trùng khớp, các tên biến này (như a ) trở thành các biến cục bộ mà bạn có thể truy cập.

Ví dụ với hàm băm :

 {a:1, b:2, c:[]} trong {a:a, b:b, c:[]} # truep a # 1 

Điều này sử dụng in từ khóa.

Nó không phải là mới, nhưng không phổ biến vì trước Ruby 2.7 in chỉ được sử dụng như một phần của for loop (rất không được khuyến khích trong Ruby), vì vậy chúng tôi có thể sử dụng lại từ khóa này cho một cái gì đó hữu ích.

Tốt hơn nữa

Không quan trọng bạn sử 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ô hình!

Các thay đổi khác

Một vài thay đổi bổ sung đáng được đề cập.

  • GC nén mới cải thiện sự phân mảnh bộ nhớ
  • Đối số phương thức **nil bây giờ tuyên bố rằng một phương thức không có từ khóa
  • Đối số phương thức ... thêm cơ chế chuyển tiếp đối số (bắt buộc phải có dấu ngoặc đơn, như make_salad(...) )
  • Cải tiến chất xơ. Một nhóm các đối tượng sợi mới (từ đó các sợi mới được phân bổ) làm cho sợi hoạt động hiệu quả hơn
  • Cải tiến chuỗi. Cách tốt hơn, được tối ưu hóa hơn để tạo luồng giúp đa luồng nhanh hơn

Bạn nghĩ gì về những điều này?

Tệp NEWS cho 2.7 đề cập đến việc cải thiện hiệu suất gấp 10 lần cho cả việc tạo sợi và sợi, tôi chưa tự kiểm tra điều này, nhưng nếu bạn cho tôi biết về kết quả của bạn.

Tóm tắt

Bạn hiện đã cập nhật những thay đổi mới nhất đối với ngôn ngữ lập trình Ruby! Bạn đã tìm hiểu về các thay đổi IRB, các phương pháp mới và một số tính năng thử nghiệm như đối sánh mẫu.

Hãy chia sẻ bài viết này để lan truyền tin tức!

Cảm ơn vì đã đọc 🙂