Pattern Matching
Dùng để xác định dữ liệu trong một pattern khi ta đã có một số thông tin hoặc cấu trúc của pattern đó
Cú pháp :
case expr
in pattern
...
in pattern
...
else
...
end
Các pattern sẽ chạy từ trên xuống dưới cho đến patten đầu tiên match với expr, nếu không nó sẽ chạy vào khối lệnh else.
Ví dụ :
Detect values khi đã biết cấu trúc của tập hợp ban đầu
case [0, [1, 2, 3]]
in [a, [b, *c]]
p a #=> 0
p b #=> 1
p c #=> [2, 3]
end
Khi đã có một số values:
case [0, [1, 2, 3]]
in [0, [a, 2, b]]
p a #=> 1
p b #=> 3
end
Pattern Matching cũng có thể sử dụng với Hash, variable..., Pattern Matching đặc biệt rất hữu ích với các tập hợp có cấu trúc phức tạp. Để rõ hơn về Pattern Matching các bạn có thể tìm hiểu ở đây
Beginless Ranges
Ở Ruby 2.6 chúng ta đã được biết đến endless range và 2.7 chúng ta sẽ được biết đến beginless range. Với Range thông thường ta cần xác định điểm đầu và cuối của range còn với beginless range chúng ta sẽ không cần xác định điểm bắt đầu của range.
Ví dụ :
a = (..3) # a gồm các số nguyên nhỏ hơn hoặc bằng 3.
# Kiểm tra
a === -1000 # => true
a === 2 # => true
a === 4 # => false
Flip flop operator
Flip flop operator được hiểu là phạm vi được sử dụng giữa 2 câu điều kiện.
Ví dụ :
(1..10).each { |i| puts i if (i == 5) .. (i == 8) }
5
6
7
8
=> 1..10
Enumerable#filter_map
Trước Ruby 2.7 select và map thường được sử dụng để lọc và biến đổi giá trị. Nhưng trong ruby 2.7 ta có thể làm điều này chỉ với filter_map
Ví dụ :
[1, 2, 3].filter_map {|x| x.odd? ? x.to_s : nil } #=> ["1", "3"]
Enumerable#tally
Với tally ta có thể xác định tần suất xuất hiện của các phần tử trong một Enumerable
Kết Luận
Trên đây là một số điểm mới trong ruby 2.7 mà mình mới tìm hiểu được. Các bạn có thể tham khảo thêm tại đây