2016-01-07 18 views
6

Tôi không thể hiểu được ưu tiên của các nhà khai thác Ruby trong một ví dụ sau:Hiểu được ưu tiên của nhiệm vụ và toán tử logic trong Ruby

x = 1 && y = 2 

Kể từ && có độ ưu tiên cao hơn =, sự hiểu biết của tôi là tương tự như +* nhà khai thác:

1 + 2 * 3 + 4 

được giải quyết như

1 + (2 * 3) + 4 

nó phải bằng:

x = (1 && y) = 2 

Tuy nhiên, tất cả các nguồn Ruby (bao gồm cả nội phân tích cú pháp cú pháp Ripper) phân tích này như

x = (1 && (y = 2)) 

Tại sao?


EDIT [2016/08/01]

Hãy tập trung vào một subexpression: 1 && y = 2

Theo quy tắc ưu tiên, chúng ta nên cố gắng phân tích nó như:

(1 && y) = 2 

điều này không có ý nghĩa bởi vì = yêu cầu LHS cụ thể (biến, hằng số, [] mục mảng vv). Nhưng vì (1 && y) là một biểu thức chính xác, trình phân tích cú pháp nên xử lý nó như thế nào?

Tôi đã cố gắng tham khảo ý kiến ​​của Ruby parse.y, nhưng nó giống như mì spaghetti mà tôi không thể hiểu các quy tắc cụ thể cho việc phân công.

+0

Câu hỏi hay, có một số bằng khen trong đối số. –

Trả lời

2

Đơn giản. Ruby chỉ diễn giải nó theo cách có ý nghĩa. = là bài tập. Trong mong đợi của bạn:

x = (1 && y) = 2 

không có ý nghĩa khi gán thứ gì đó cho 1 && y. Bạn chỉ có thể gán thứ gì đó cho một biến hoặc một hằng số.

Và lưu ý rằng mục đích của quy tắc ưu tiên là phân biệt một biểu thức không rõ ràng khác. Nếu một cách để giải thích nó không có ý nghĩa, thì không cần định hướng, và do đó quy tắc ưu tiên sẽ không có hiệu lực.

+2

Trình phân tích cú pháp sử dụng các quy tắc, nó không có thông minh để phân biệt cái gì có ý nghĩa và cái gì không, vì vậy câu trả lời của bạn không rõ ràng. –

+0

@ RustamA.Gasanov Kiểm tra xem phía bên tay trái của nhiệm vụ là một biến hay một hằng số không yêu cầu thông minh. Nó có thể được thực hiện mà không cần thực thi mã. – sawa

+0

Tôi thực sự đang cố gắng viết một trình phân tích cú pháp Ruby để tìm hiểu tốt hơn về các bên trong Ruby. Và câu trả lời của bạn không thực sự hữu ích. 'x = 1 && y' (tương đương với' x = (1 && y) ') là một biểu thức chính xác, mà trình phân tích cú pháp rất vui khi chấp nhận theo các quy tắc ngữ pháp chung. Do đó, tôi đang tìm một cơ chế cụ thể trong ngữ pháp Ruby để phân tích cú pháp 'y = 2' trước trong trường hợp này. – Michael

0

sự hiểu biết của tôi là trong trường hợp của

x = 1 && y = 2 

Các logic AND phân tích đầu tiên. AND sau đó buộc phải đánh giá bên trái và bên phải của nó. Trong đánh giá phía bên trái nhiệm vụ đầu tiên xảy ra, và sau đó trong đánh giá của phía bên phải thứ hai không giống nhau. Vì lý do này, trong trường hợp:

x = false && y = 2 

"y" sẽ không bao giờ được chỉ định.AND được nhấn, buộc gán x để đánh giá, nhưng không bao giờ làm phiền việc gán y, vì nó không cần thiết cho AND để hoàn thành mục đích của nó.

Nói cách khác, trình phân tích cú pháp, một lần nữa, đơn giản là hiểu biết của tôi, đủ thông minh để nhận ra rằng khi chạy AND phương trình được chia thành một bên trái và bên phải (phương trình), lần lượt được đánh giá theo thứ tự hoạt động.

+0

Toán tử 'và' hoạt động theo cách bạn mô tả. '&&' được hiểu là 'x = (1 && (y = 2))'. Có, nếu '1' được thay thế bởi' false'/'nil' thì' y = 'gán sẽ không được giải quyết chút nào, nhưng không phải vì giá trị' x', mà là do phía bên trái của biểu thức bên trong ('1 && (y = 2)'). – Michael

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