Câu trả lời:
and
là 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: and
thậm chí có mức độ ưu tiên thấp hơn mức =
bạn thường muốn tránh and
. Có and
thể 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 and
chỉ nên sử dụng cho các trường hợp rất cụ thể.
and
là một if
công cụ sửa đổi câu lệnh đảo ngược : next if widget = widgets.pop
trở 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à or
giống như một công cụ unless
sử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 and
có ưu tiên thấp hơn &&
.
a = foo and bar
tươ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
/ or
hoà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
/ unless
toá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).
and
và or
có quyền ưu tiên thấp hơn.
Ví dụ, không giống như ||
, or
có 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ư &&
, and
cũ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à ||
, and
và or
rà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 and
và or
có 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/ .
||
, or
có quyền ưu tiên thấp hơn =
" ... bây giờ nó có ý nghĩa hơn, cảm ơn!
and
có 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
and
có 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 if
nhưng không and
, vì if
dễ hiểu hơn, vì vậy tôi chỉ cần bỏ qua and
và 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
or
và||
.