"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 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 có mức độ ưu tiên thấp hơn &&, ||
- and và or 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à ||
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ề and và or
Như đã nói ở trên and và or có độ ưu tiên thấp hơn && và ||. 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à and và or 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 and và or có mức độ ưu tiên như nhau, còn && và || 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 và &&, or và ||. 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