Tôi tự hỏi tại sao ruby tặng and
, or
ít ưu tiên hơn &&
, ||
và chỉ định toán tử? Có lý do gì không?Có bất kỳ sự khôn ngoan nào đằng sau các toán tử "và", "hoặc" trong Ruby không?
Trả lời
Đoán của tôi là đó là chuyển tiếp trực tiếp từ Perl. Các toán tử or
và and
được thêm vào sau trong Perl 5 cho các tình huống cụ thể được ưu tiên thấp hơn là mong muốn.
Ví dụ, trong Perl, ở đây chúng tôi muốn rằng ||
có độ ưu tiên thấp hơn, để chúng ta có thể viết:
try to perform big long hairy complicated action || die ;
và chắc chắn rằng các ||
sẽ không nuốt chửng một phần của hành động. Perl 5 đã giới thiệu or
, một phiên bản mới của ||
có ưu tiên thấp, cho mục đích chính xác này.
Một ví dụ trong Ruby nơi bạn có thể sử dụng or
nhưng không ||
:
value = possibly_false or raise "foo"
Nếu bạn sử dụng ||
, nó sẽ là một lỗi cú pháp.
Việc có thể kiểm soát quyền ưu tiên của các toán tử đôi khi hữu ích, đặc biệt nếu bạn quan tâm đến khả năng đọc - dấu ngoặc đơn phụ trong câu lệnh điều kiện đôi khi có thể che khuất logic thực tế. Tuy nhiên, tôi nghĩ lý do Ruby có mức ưu tiên toán tử boolean nó xuất phát chủ yếu từ thực tế là Matz là một lập trình viên Perl trước khi anh ấy viết Ruby, và mượn nhiều cú pháp và toán tử cốt lõi từ ngôn ngữ đó.
hmm, giải thích tại sao ruby quá non nớt và đồng thời quá cồng kềnh. Vẫn còn khó khăn để quấn đầu của tôi xung quanh đó .. – akostadinov
Chúng có độ ưu tiên rất thấp để các toán hạng không phải được bao bọc trong dấu ngoặc đơn, đôi khi trường hợp với &&
và ||
.
Tôi tin rằng ý tưởng là đặc biệt để có được chúng bên dưới các toán tử gán, vì vậy bạn có thể viết các bài kiểm tra logic với các bài tập nhưng không có parens.
Sự khác biệt được ưu tiên. ||
, &&
có mức độ ưu tiên cao hơn =
, nhưng and
, or
có mức ưu tiên thấp hơn. Vì vậy, trong khi bạn có thể làm:
a = nil || 0
Bạn sẽ phải làm:
a = (nil or 0)
để có được cùng hiệu quả. Nếu bạn làm:
a = nil or 0
Kết quả của biểu thức vẫn là 0, nhưng giá trị sẽ là 0.
- 1. Toán tử thay đổi khôn ngoan với sự dịch chuyển theo số âm
- 2. Truy cập các yếu tố của ma trận hàng khôn ngoan so với cột khôn ngoan
- 3. Có bất kỳ giới hạn nào về các loại trong toán tử định kiểu không?
- 4. Are>? hoặc <? các toán tử hợp pháp trong bất kỳ phương ngữ C++ nào?
- 5. Toán đằng sau Bump (ing)?
- 6. Có quyết định khôn ngoan để chuyển từ .NET sang Java EE hoặc RoR không?
- 7. Tính hàng khôn ngoan tỷ lệ
- 8. Phương pháp tĩnh hoặc Singletons hiệu suất khôn ngoan (Android)?
- 9. Có bất kỳ toán tử IF có điều kiện nào trong Apache PIG không?
- 10. Element-khôn ngoan có nghĩa là trong R
- 11. Hoạt động khôn ngoan của hàng trong octave
- 12. Các toán tử so sánh Ruby? == và ===
- 13. Làm thế nào để kết hợp hai phần tử mảng numpy khôn ngoan trong python?
- 14. toán tử boolean ruby hoặc || Sự khác biệt
- 15. '|| =' toán tử trong Ruby
- 16. Python yếu tố khôn ngoan như sum
- 17. Có bất kỳ sự khác biệt nào giữa DATE_SUB() và sử dụng toán tử số học để tính toán ngày giờ không?
- 18. Element-khôn ngoan cho hai danh sách
- 19. Java: Phân loại các chuỗi có tiền tố (ArrayLists) một cách khôn ngoan
- 20. Ruby có bất kỳ lớp định dạng số nào không?
- 21. Có bất kỳ mã hoặc thuật toán nào để nhận dạng chữ ký không?
- 22. Hoạt động ma trận hàng khôn ngoan trong R
- 23. Tiết kiệm mảng NumPy để txt hàng tập khôn ngoan
- 24. Bó chuỗi sau một số ký tự word-khôn ngoan trong Java
- 25. Những cách khôn ngoan để vẽ một ngôi sao Star
- 26. Các phiên PHP có đặt bất kỳ cookie nào không?
- 27. Postgres Hstore so với Redis - hiệu suất khôn ngoan
- 28. Hồi quy tuyến tính và phi tuyến tính một cách khôn ngoan trong R
- 29. Có bất kỳ thông dịch viên Ruby hoặc Python nào cho Lego Mindstorm không?
- 30. Làm thế nào để nhanh chóng chọn (bên trong) line-khôn ngoan trong Vim
Có một tên cho các thành ngữ của do_something hoặc chết? Liệu nó có được sử dụng trong ruby? –
Tôi không biết bất kỳ tên nào cho nó, nhưng nó khá phổ biến trong Ruby. – Chuck
Perl dựa nhiều vào chết, trong khi Ruby sử dụng tăng. Lợi thế của một ngoại lệ là bạn có thể giải cứu nó. – tadman