Câu trả lời:
Chúng gần như đồng nghĩa, nhưng không hoàn toàn. Sự khác biệt là !
có mức độ ưu tiên cao hơn not
, rất giống &&
và ||
có mức độ ưu tiên cao hơn and
và or
.
!
có mức độ ưu tiên cao nhất trong tất cả các toán tử và not
một trong những toán tử thấp nhất, bạn có thể tìm thấy toàn bộ bảng tại tài liệu Ruby .
Ví dụ, hãy xem xét:
!true && false
=> false
not true && false
=> true
Trong ví dụ đầu tiên, !
có mức độ ưu tiên cao nhất , vì vậy bạn đang nói một cách hiệu quả false && false
.
Trong ví dụ thứ hai, not
có mức độ ưu tiên thấp hơn true && false
, vì vậy điều này "chuyển" false
từ từ true && false
sang true
.
Nguyên tắc chung dường như là bạn nên tuân thủ !
, trừ khi bạn có lý do cụ thể để sử dụng not
. !
trong Ruby hoạt động giống như hầu hết các ngôn ngữ khác và "ít đáng ngạc nhiên hơn" hơn not
.
unless
trong trường hợp đó không?
unless
chỉ là không thực sự được ưa chuộng trong thế giới ruby. Sự đồng thuận chung là nó chỉ cản trở khi !
hoạt động tốt trong hầu hết các tình huống. Tôi chắc rằng có những trường hợp trừ khi có thể diễn đạt hơn, nhưng tôi chỉ rõ.
unless
là không thích. Điều gần nhất mà chúng ta phải đồng thuận lại nói khác.
not
có thể được. Trong Python, đôi khi tôi gán boolean cho các biến để làm cho câu lệnh if dễ đọc hơn. Điều đó có thể có nghĩa là sử dụng mẫu x = not y
, trong đó y là một cái gì đó phức tạp. Trong Ruby, x = !y
hoạt động, nhưng x = not y
bị syntax error, unexpected tIDENTIFIER, expecting '('
. Trình tự ưu tiên có nghĩa là điều này cần ngoặc xung quanh phía bên phải của op phân công công việc: x = (not y)
.