Câu trả lời:
andlà giống như &&nhưng với quyền ưu tiên thấp hơn . Cả hai đều sử dụng đánh giá ngắn mạch .
CẢNH BÁO: andthậm chí có mức độ ưu tiên thấp hơn mức =bạn thường muốn tránh and. Có andthể tìm thấy một ví dụ khi sử dụng trong Hướng dẫn Rails trong phần " Tránh lỗi kết xuất kép ".
&&, trong khi andchỉ nên sử dụng cho các trường hợp rất cụ thể.
                    andlà một ifcông cụ sửa đổi câu lệnh đảo ngược : next if widget = widgets.poptrở thành widget = widgets.pop and next. Đó là một cách tuyệt vời để đặt nó, thực sự khiến nó" nhấp "trong đầu tôi. (Và orgiống như một công cụ unlesssửa đổi đảo ngược .)
                    Sự khác biệt thực tế là sức mạnh ràng buộc, có thể dẫn đến hành vi kỳ dị nếu bạn không chuẩn bị cho nó:
foo = :foo
bar = nil
a = foo and bar
# => nil
a
# => :foo
a = foo && bar
# => nil
a
# => nil
a = (foo and bar)
# => nil
a
# => nil
(a = foo) && bar
# => nil
a
# => :foo
Điều tương tự làm việc cho ||và or.
a = foo and bar và (a = foo ) && bar chứng minh rằng andcó ưu tiên thấp hơn &&.
                    a = foo and bartương đương với (a = :foo) and nil. Vì phép gán trả về giá trị logic ( :foo) nên phần thứ hai sẽ đánh giá, không thành công, trả về nil.
                    Các của Ruby Style Guide nói nó tốt hơn tôi có thể:
Sử dụng && / || cho các biểu thức boolean và / hoặc cho luồng điều khiển. (Quy tắc ngón tay cái: Nếu bạn phải sử dụng dấu ngoặc đơn bên ngoài, bạn đang sử dụng các toán tử sai.)
# boolean expression
if some_condition && some_other_condition
  do_something
end
# control flow
document.saved? or document.save!
              and/ orhoàn toàn, và họ có thể có một điểm. Thường thì việc sử dụng chúng trong luồng điều khiển có thể được viết rõ ràng hơn bằng if/ unlesstoán tử (ví dụ document.save! unless document.saved?)
                    ||và &&liên kết với quyền ưu tiên mà bạn mong đợi từ các toán tử boolean trong các ngôn ngữ lập trình ( &&rất mạnh, ||hơi kém mạnh).
andvà orcó quyền ưu tiên thấp hơn.
Ví dụ, không giống như ||,   orcó quyền ưu tiên thấp hơn =:
> a = false || true
 => true 
> a
 => true 
> a = false or true
 => true 
> a
 => false
Tương tự như vậy, không giống như &&, andcũng có quyền ưu tiên thấp hơn =:
> a = true && false
 => false 
> a
 => false 
> a = true and false
 => false 
> a
 => true 
Hơn thế nữa, không giống như &&và ||, andvà orràng buộc với ưu tiên bằng nhau:
> !puts(1) || !puts(2) && !puts(3)
1
 => true
> !puts(1) or !puts(2) and !puts(3)
1
3
 => true 
> !puts(1) or (!puts(2) and !puts(3))
1
 => true
Liên kết yếu andvà orcó thể hữu ích cho các mục đích kiểm soát luồng: xem http://devblog.avdi.org/2010/08/02/USE-and-and-or-in-ruby/ .
||, orcó quyền ưu tiên thấp hơn =" ... bây giờ nó có ý nghĩa hơn, cảm ơn!
                    andcó quyền ưu tiên thấp hơn &&.
Nhưng đối với một người dùng không thông thạo, các sự cố có thể xảy ra nếu nó được sử dụng cùng với các toán tử khác có quyền ưu tiên nằm ở giữa, ví dụ, toán tử gán:
def happy?() true; end
def know_it?() true; end
todo = happy? && know_it? ? "Clap your hands" : "Do Nothing"
todo
# => "Clap your hands"
todo = happy? and know_it? ? "Clap your hands" : "Do Nothing"
todo
# => true
              andcó mức độ ưu tiên thấp hơn, chủ yếu chúng tôi sử dụng nó như một công cụ sửa đổi dòng điều khiển, chẳng hạn như if:
next if widget = widgets.pop
trở thành
widget = widgets.pop and next
Dành cho or:
raise "Not ready!" unless ready_to_rock?
trở thành
ready_to_rock? or raise "Not ready!"
Tôi thích sử dụng ifnhưng không and, vì ifdễ hiểu hơn, vì vậy tôi chỉ cần bỏ qua andvà or.
Tham khảo " Sử dụng các ứng dụng khác và trên mạng và trong hoặc trên Ruby " để biết thêm thông tin.
Tôi không biết đây là ý định của Ruby hay đây là lỗi nhưng hãy thử mã này bên dưới. Mã này được chạy trên phiên bản Ruby 2.5.1 và trên hệ thống Linux.
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true
              
orvà||.