12/08/2018, 15:02

"and" vs && và "or" vs || trong Ruby

Trong Ruby ta đều biết về cặp toán tử and và && , or và || . Nếu bạn nhìn bên ngoài thì chúng không có gì khác nhau cả nhưng thực ra giữa các cắp toán tử này có sự khác biệt rõ ràng. Thực sự là and không giống && và or cũng không giống || , lý do là vì: and , or ...

Trong Ruby ta đều biết về cặp toán tử and&&, or||. Nếu bạn nhìn bên ngoài thì chúng không có gì khác nhau cả nhưng thực ra giữa các cắp toán tử này có sự khác biệt rõ ràng. Thực sự là and không giống &&or cũng không giống ||, lý do là vì:

  • and, or có mức độ ưu tiên thấp hơn &&, ||
  • andor có mức độ ưu tiên như nhau trong khi đó && có độ ưu tiên cao hơn ||

Cách hoạt động của &&||

Về toán tử && sẽ return về 1 giá true nếu cả hai toán hạng trái phải đều true, nếu không là false cho các trường hợp khác. Đầu tiên nó kiểm tra toán hạng bên trái, nếu toán hạng có có giá trị là nil hoặc false thì lập tức return giá trị đấy và bỏ qua toán hạng bên phải. Ngược lại nếu toán hạng đó có giá trị true thì kết quả của phép && sẽ phụ thuộc vào giá trị toán hạng bên phải

a = nil && true  # => a = nil
a = true && 1  # => a = 1

Tương tự với || sẽ sẽ return về 1 giá true nếu một trong hai toán hạng trái phải là true và return false cho các trường hợp khác. Toán tự || sẽ thực hiện như này: đầu tiên nó sẽ kiểm tra toán hạng bên trái nếu giá trị khác nil hoặc false, nó chỉ đơn giản trả về giá trị đấy. Nếu không thì nó đánh giá toán hạng bên phải và trả về giá trị đó

a = 1 || nil  # => a = 1
a = false || nil  # => a = nil

Lưu ý rằng && có độ ưu tiên cao hơn || :

1 || 2 && nil  # => 1
(1 || 2) && nil  # => nil

Về andor

Như đã nói ở trên andor có độ ưu tiên thấp hơn &&||. Một lý do để sử dụng chúng là vì đó giống với tiếng Anh vì vậy sẽ làm code của bạn dễ đọc hơn

if x > 0 and y > 0 and not defined? d then d = Math.sqrt(x*x + y*y) end

Một lý do khác đó là andor có độ ưu tiên thấp hơn toán tử =. Điều đó nghĩa là bạn có thể viết một biểu thức như sau để gán giá trị cho các biến cho đến khi gặp một giá trị false:

if a = f(x) and b = f(y) and c = f(z) then d = g(a, b, c) end

Biểu thức này sẽ không thực hiện nếu thay and bằng && Lưu ý rằng andor có mức độ ưu tiên như nhau, còn &&|| có mức ưu tiên khác nhau. Ví dụ hai biểu thức sau đây sẽ có giá trị khác nhau:

x || y && nil  # && thuc hien truoc => x
x or y and nil  # thuc hiện tu trai sang phai => nil

Trên đây là một số sự khác biệt về and&&, or||. Hi vọng các bạn có thể hiểu được sự khác biệt giữa chúng và cách sử dụng trong từng trường hợp.

Tham khảo

Sách The Ruby Programming Language - O'Reilly Media http://stackoverflow.com/questions/2083112/difference-between-or-and-in-ruby

0