Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Khám phá 9 cải tiến chính trong Ruby 2.6

Một phiên bản Ruby mới sắp ra mắt với tính năng mới và cải tiến hiệu năng.

Bạn muốn cập nhật những thay đổi?

Hãy cùng xem!

Range vô tận (Endless Ranges)

Ruby 2.5 và các phiên bản cũ đã hỗ trợ một dạng range vô tận (với Float::INFINITY), nhưng Ruby 2.6 đưa điều này đến mức độ mới.

Range vô tận mới trông như sau:

 (1..) 

Khác với range thông thường vì nó không có giá trị kết thúc như (1..10).

Ví dụ sử dụng:

 ["a", "b", "c"].zip(1..) # [["a", 1], ["b", 2], ["c", 3]]
[1,2,3,4,5][1..] # [2, 3, 4, 5]
(1..).step(5).take(100) # [1, 6, 11, 16, 21, 26, 31, 36, 41, 46] 

Bạn còn nghĩ ra ví dụ nào khác?

Enumerable::ArithmeticSequence

Một loại đối tượng Enumerable mới được giới thiệu trong Ruby 2.6.

Đó là Enumerable::ArithmeticSequence.

Hiện tại có hai phương thức cho ra ArithmeticSequence:

  • Range#step
  • Numeric#step

Điều gì đặc biệt về nó?

Một ArithmeticSequence biết số lượng phần tử, phần tử đầu tiên và cuối cùng.

Ví dụ:

 (1..10).step(2).first # 1
(1..10).step(2).last # 9 

Các phương thức first và last này không có trước Ruby 2.6 và đó là lý do ArithmeticSequence tồn tại!

Khác biệt khác:

 (1..10).step(2) == (1..10).step(2) # false - Ruby 2.5 (và cũ hơn)
(1..10).step(2) == (1..10).step(2) # true - Ruby 2.6 

Các dãy số học có thể so sánh với nhau trong 2.6.

Gộp Hash với nhiều đối số

Nếu muốn gộp nhiều hash để kết hợp thành một…

Bạn có thể làm:

 a = { a: 1 }
b = { b: 2 }
c = { c: 3 }
a.merge(b).merge(c) # {:a=>1, :b=>2, :c=>3} 

Ruby 2.6 thêm cách mới:

 a.merge(b, c) # {:a=>1, :b=>2, :c=>3} 

Kết quả giống nhau, nhưng chỉ cần gọi phương thức một lần!

Tùy chọn exception mới

Khi dùng phương thức chuyển đổi như Integer, bạn sẽ gặp exception nếu giá trị không chuyển được.

Ví dụ:

 Integer("a") # ArgumentError (invalid value for Integer(): "a") 

Ruby 2.6 thêm đối số từ khóa exception cho:

  • Integer()
  • Float()
  • Rational()
  • Complex()

Bạn có thể kiểm soát hành vi của các phương thức này bằng từ khóa này.

Ví dụ:

 Integer("a", exception: false) # nil 

Random.bytes

Nếu cần một số byte ngẫu nhiên, Ruby 2.6 thêm phương thức bytes vào class Random.

Ví dụ:

 Random.bytes(10) # "\xCD\r\xE6Wz\xBA)\x02\xC4\xDB" 

Chức năng này không hoàn toàn mới vì luôn có sẵn qua module securerandom.

 require 'securerandom'
SecureRandom.bytes(10) 

Tại sao cần phương thức mới này?

Random.bytes đánh đổi bảo mật để đổi lấy tốc độ, nó nhanh gấp 8 lần SecureRandom.

Range#%

Phương thức % mới được thêm vào Range trong Ruby 2.6.

Ví dụ:

 ((0..) % 2).take(5) # [0, 2, 4, 6, 8] 

Phương thức này tương đương với Range#step.

TracePoint#parameters

Class TracePoint giúp theo dõi sự kiện như gọi phương thức, định nghĩa class và thread.

Ruby 2.6 thêm phương thức parameters mới.

Với phương thức mới này, bạn có thể in danh sách tham số của phương thức đang được gọi.

Ví dụ:

 TracePoint.trace(:call, :b_call, :c_call) do |tp|
  p [tp.event, tp.parameters]
end
def orange(a,b,c*)
end
orange(1,2,3) 

Kết quả:

 [:call, [[:req, :a], [:req, :b], [:rest, :c]]] 

Transient Heap (Heap tạm thời)

Transient heap là cải tiến hiệu năng cho đối tượng tồn tại ngắn nhằm giảm vấn đề phân mảnh bộ nhớ và lời gọi malloc chậm.

Malloc là cách trình thông dịch Ruby (và hầu hết chương trình C) yêu cầu bộ nhớ từ hệ điều hành.

Theo mục NEWS, chúng ta đang nhìn vào tăng tốc 6-7%.

Tôi chạy một số benchmark:

Có vẻ như điều này hiệu quả nhất khi tạo nhiều hash nhỏ hơn 10 phần tử.

Khám phá 9 cải tiến chính trong Ruby 2.6

Hash lớn hơn chạy chậm hơn trong Ruby 2.6 (preview 3) dựa trên kết quả này.

Các đối tượng khác có thể hưởng lợi từ Transient Heap:

  • Arrays
  • Struct
  • Đối tượng thông thường (từ class bạn tự tạo)

Array#union và Array#difference

Hai phương thức mới, union và difference được thêm vào class Array trong Ruby 2.6.

Ví dụ:

 [1,2,3,4,5].difference([3]) # [1, 2, 4, 5]
[1,2,3,4,5].union([5,6,7]) # [1, 2, 3, 4, 5, 6, 7] 

Các phương thức mới này nhận nhiều đối số.

Tóm tắt

Ruby 2.6 đến với tính năng mới hữu ích giúp bạn viết code tốt hơn trong ít thời gian hơn. Tính năng hiệu năng liên quan khác, MJIT (Method Based Just-in-Time Compiler) sẽ được đề cập trong bài riêng.

Ruby 2.6 dự kiến phát hành vào 25 tháng 12, 2018.

Nếu muốn cập nhật thay đổi, nâng cao kỹ năng Ruby và trở thành lập trình viên Ruby giỏi, đừng quên đăng ký newsletter Ruby của tôi hôm nay.

Cảm ơn bạn đã đọc!