Một số tính năng mới trong Ruby 2.6

Phiên bản Ruby 2.6 vừa được phát hành ngày 25/12/2018 bổ sung một số tính năng mới. Bài viết sau đây giới thiệu tới các bạn 9 tính năng mới được bổ sung trong phiên bản Ruby 2.6:

Endless Range

Ruby 2.5 và các phiên bản cũ hơn đã hỗ trợ một dạng Endless Range (với Float::INFINITY), nhưng Ruby 2.6 đưa nó lên cấp độ tiếp theo. Nó trong như thế này:

(1..)

Điều này khác với Range thông thông thường vì nó không có giá trị kết thúc (1..10).
(Lưu ý: Nếu hệ thống của bạn chưa được cài đặt phiên bản Ruby 2.6 thì bạn có thể cài đặt nó thông qua rvm bằng lệnh rvm install 2.6)
Ví dụ:

["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]

Enumerable::ArithmethicSequence

Ruby 2.6 cung cấp một module mới của lớp EnumerableArithmethicSequence (Enumerable::ArithmethicSequence). Nó là một lớp con của Enumerable và có thể được tạo bằng các phương thức Range#stepNumeric#step.
Nó có gì đặc biệt? ArithmethicSequence biết có bao nhiêu phần tử, phần tử đâù tiên & phần tử cuối cùng là gì.
Ví dụ:

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

firstlast là những phương thức không có sẵn trong các phiên bản trước. Và đó là lý do tại sao ArithmethicSequence được bổ sung ở phiên bản mới này.
Một điểm khác biệt:

(1..10).step(2) == (1..10).step(2)     # false - Ruby 2.5 (and older)
(1..10).step(2) == (1..10).step(2)     # true - Ruby 2.6

Arithmetic sequence có thể được so sánh với nhau trong phiên bản 2.6.

Merge Hash With Multiple Arguments

Nếu bạn muốn merge nhiều giá trị băm với nhau để có thể kết hợp chúng thành một bản. Ở các phiên bản trước bạn có thể làm điều này bằng cách:

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 một cách mới giúp code của bạn ngắn gọn hơn như sau:

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

Kết quả là tương tự nhau, nhưng bạn chỉ cần gọi phương thức merge một lần.

New Exception Option

Ở các phiên bản cũ khi bạn sử dụng một conversion method như Integer, bạn sẽ nhận được một ngoại lệ nếu giá trị bạn truyền vào không hợp lệ.
Ví dụ:

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

Ruby 2.6 thêm một đối số với từ khóa là exception vào: Integer(), Float(), Rational(), Complex() giúp bạn kiểm soát hành vi của các method này.
Ví dụ:

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

Random.bytes

Ruby 2.6 thêm phương thức bytes vào lớp Random giúp bạn tạo ra các byte ngẫu nhiên.
Ví dụ:

Random.bytes(10)

Đây không phải là chức năng hoàn toàn mới vì module securerandom cũng có sẵn. Tuy nhiên Random.bytes nhanh hơn gấp 8 lần SecureRandom.

require 'securerandom'
SecureRandom.random_bytes(10)     # "\x7F/\xEF\xFA\xF3\xDB\xC5\xD7\xEB\x1E"

Range#%

Ruby 2.6 có thêm một phương thức % cho Range.
Ví dụ:

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

Tương đương với Range#step.

TracePoint#parameters

Lớp TracePoint giúp bạn theo dõi các sự kiện như các cuộc gọi phương thức, các định nghĩa lớp và các thread. Ruby 2.6 thêm một 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 các tham số cho phương thức đượ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)     # [:call, [[:req, :a], [:req, :b], [:rest, :c]]]

Transient Heap

Transient Heap là một cải tiến hiệu suất cho các đối tượng có thời gian tồn tại ngắn nhằm mục đích giảm vấn đề phân mảnh bộ nhớ và có cuộc gọi chậm tới malloc.

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

Array#union & Array#difference

Hai phương thức mới uniondifference được thêm vào lớp 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]

Tóm lược

Ruby 2.6 ra mắt với các tính năng hữu ích giúp bạn viết mã tốt hơn trong thời gian ngắn hơn. Một tính năng mới khác liên quan đến hiệu suất, MJIT sẽ được giới thiệu trong bài viết sắp tới.
Nguồn bài viết: 9 New Features in Ruby 2.6
Happy coding!