2009-09-16 16 views

Trả lời

15

Đoán của tôi là đó là chuyển tiếp trực tiếp từ Perl. Các toán tử orand đượ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.

+0

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? –

+0

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

+0

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

4

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ữ đó.

+0

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

5

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 &&||.

2

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.

7

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.

Các vấn đề liên quan