Sự khác biệt giữa `not` và`! 'Trong ruby


Câu trả lời:


142

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 &&||có mức độ ưu tiên cao hơn andor.

!có mức độ ưu tiên cao nhất trong tất cả các toán tử và notmộ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, !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, notcó mức độ ưu tiên thấp hơn true && false, vì vậy điều này "chuyển" falsetừ từ true && falsesang 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.


6
Trước đây tôi đã sử dụng 'not' để làm cho các điều kiện phủ định dễ đọc hơn. Có nghĩa là nếu toàn bộ điều kiện phải được phủ định, tôi cảm thấy thoải mái khi sử dụng 'not' hơn là '!'. Tôi thích nó khi mã của tôi đọc như inglush
jaydel

@jaydel Bạn có thể sử dụng unlesstrong trường hợp đó không?
Jacob

1
@Jacob, vâng, chắc chắn rồi. unlesschỉ 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õ.
Brennan

4
Tôi không đồng ý điều đó unlesslà 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.
Adam Lassek

1
Chỉ muốn chia sẻ một ví dụ về mức độ đáng ngạc nhiên notcó 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 = !yhoạt động, nhưng x = not ybị 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).
S. Kirby

13

Một cách đơn giản để hiểu nottoán tử là xem not true && falsenó tương đương với!(true && false)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.