Cách sử dụng Any, All, None và One trong Ruby

Bài viết này mình sẽ giới thiệu về 4 phương pháp có thể giúp các bạn kiểm tra một câu lệnh có điều kiện đối với một mảng các phần tử, hash hoặc bất kỳ đối tượng nào khác include Enumerable module. 4 method đó được thể hiện trong bảng sau Cả 4 đều return 1 trong 2 giá trị true hoặc false

All Method

Để hiểu về cách sửu dụng hàm này mình sẽ đưa ra một ví dụ:

Nếu bạn muốn kiểm tra xem tất cả các chuỗi bên trong một mảng có cùng một kích thước cụ thể không.

def all_words_have_specific_size?(words)
  return false if words.empty?

  words.each do |str|
    return false unless str.size == 5
  end

  true
end

words = ["bacon", "orange", "apple"]

all_words_have_specific_size?(words)
# => false

Cách trên sẽ duyệt qua tất cả các phần tử trong mảng, nếu có một phần tử khác với size cho trước lập túc trả về false, còn không nếu mảng được duyệt qua mà chưa trả về false thì method sẽ trả về true.

Việc kiểm tra như vậy cám giác là phải viết rất nhiều thứ, xây dựng hàm v.v

Cảm thấy những dòng code kia thật dài dòng nhưng nó chỉ xung quanh việc phục vụ cho điều kiện kiểm tra

str.size == 5

Đó là điều kiện chúng ta cần kiểm tra, và có cách nào nhìn gọn và hay hơn cách phải viết hàm ở trên không? Câu trả lời là có, chúng ta có thể sử dụng phương thức all? cho việc đó. Cách sử dụng như sau

strings.all? { |str| str.size == 5 }

Trông thật đẹp và gọn phải không 😃

All & Empty Arrays

Khi sử dụng all có một điều cần phải nhớ đó là:

Phương thức all? sẽ trả về true nếu bạn gọi nó trên một mảng trống.

[].all? { |s| s.size == 1 }
# => true

None Method

Ngược lại với all? chính là none?

strings.none? { |str| str.size == 5 }

Điều này trả về true nếu không có chuỗi nào khớp với điều kiện hoặc sai nếu có nhiều hơn 1 chuỗi khớp với nó.

Với mảng rỗng, method none? trả về giá trị true

[].none?

# => true

Any Method

Method any? trả về true nếu trong mảng có ít nhất một phần tử thoả mãn điều kiện Ví dụ như

[-1,0,1].any? { |n| n > 0 
# => true

[-1,0].any? { |n| n > 0 }
# => false

*Chú ý trong trường hợp không đặt điều kiện cho any

  • Trong trường hợp không có điều kiện cho any thì hàm sẽ trả về true nếu mảng có phần tử khác nil, false
[1,2,3,4,5].any?
# => true

Với ví dụ như trên thì any? được hiểu như là đảo ngược cảu empty?

  • Trong trường hợp mảng không có giá trị nào, hoặc mảng chỉ toàn phần tử mang giá trị nil, false thì method any? sẽ trả về false
[nil, false].any?
# => false

[].any?
# => false

One Method

Method kiểm tra xem trong mảng có phải có duy nhất một phần tử thỏa mãn với điều kiện hay không

Ví dụ

[-1,0,1].one? { |n| n > 0 }
 # => true 

 [-1,0,1,2].one? { |n| n > 0 }
 # => false 

*Chú ý trong trường hợp không đặt điều kiện cho one

  • Trong trường hợp không có điều kiện cho any thì hàm sẽ trả về true nếu mảng có một phần tử khác nil, false
[1].one?
# => true

[nil, 1].one?
# => true

[1, 2].one?
# => false

Với ví dụ như trên thì any? được hiểu như là đảo ngược cảu empty?

  • Trong trường hợp mảng không có giá trị nào, hoặc mảng chỉ toàn phần tử mang giá trị nil, false thì method any? sẽ trả về false
[nil, false].one?
# => false

[].one?
# => false

Kết luận

Bài viết này mình đã giới thiệu về 4 method any?, all?, none? & one? cùng các trường hợp dễ gây ra hiểu nhầm cũng như lôi logic khi code. Cảm ơn mọi người đã đón xem và hi vọng mọi người sẽ dùng nó thật tốt cho việc code của mình. Bài viết tham khảo: https://www.rubyguides.com/2018/10/any-all-none-one/