2012-11-21 25 views
10

Tôi đang chạy Ruby 1.9.Toán tử "HOẶC" phải được đặt ở cuối dòng trước? (TOROP không mong muốn)

Đây là một cú pháp hợp lệ:

items = (data['DELETE'] || data['delete'] || 
     data['GET'] || data['get'] || data['POST'] || data['post']) 

Nhưng điều này mang lại cho tôi một lỗi:

items = (data['DELETE'] || data['delete'] 
     || data['GET'] || data['get'] || data['POST'] || data['post']) 

t.rb:8: syntax error, unexpected tOROP, expecting ')' 
     || data['GET'] || data['get'] |... 
     ^

Tại sao ?!

Trả lời

8

Những gì tôi có thể nói là "đó chỉ là cách nó hoạt động".

Trình phân tích cú pháp Ruby thực hiện một công việc tuyệt vời, nói chung, để tìm ra khi một biểu thức cần tiếp tục trên một dòng khác. Chỉ là về mọi ngôn ngữ khác trên thế giới hoàn toàn punts về vấn đề này và đòi hỏi một nhân vật thực tế hoặc là tiếp tục đến dòng tiếp theo hoặc chấm dứt tuyên bố.

Như bạn đã biết, Ruby là đặc biệt trong đó, hầu như luôn luôn, nó chỉ con số nó ra.

Trong trường hợp này, mặc dù, có xung đột. Trình phân tích cú pháp biết rằng biểu thức của bạn chưa hoàn thành, bởi vì nó vẫn đang tìm kiếm ), nhưng nó có thể là một biểu thức phức hợp.

Ví dụ, bạn có thể viết một cái gì đó như thế này:

(p :a; p :b; p :c) 

... nhưng sử dụng newline terminator mềm thay vì ; ... cú pháp dưới đây không thực sự làm việc:

(p :a 
p :b 
p :c) 

(BTW, giá trị của biểu thức đó là giá trị của biểu thức cuối cùng trong chuỗi.)

Ruby không thể phân tích cú pháp cả câu lệnh của bạn và câu lệnh trên với ra một gợi ý tốt hơn như một nhà điều hành nhị phân rõ ràng đòi hỏi một dòng khác.

+0

Tôi không chắc chắn nếu "công việc tuyệt vời" là chính xác (tôi cho rằng điều này là * lẻ * vì biểu thức * có thể * được tiếp tục bởi toán tử trên dòng sau), * nhưng * nó là ngôn ngữ Ruby (mụn cóc và tất cả) được định nghĩa như thế nào +1. (JavaScript xử lý điều này theo cách khác - và có lẽ nhiều hơn "dự kiến" - với một số sản phẩm bị hạn chế cho ASI.) –

+1

Thực ra: Scala và Python - cũng không yêu cầu dấu chấm phẩy - * cũng * xử lý điều này khác nhau và có lẽ "mong đợi" , so với Ruby. Họ không hỗ trợ các hình thức sau này lập luận cho câu trả lời (với dấu ngoặc đơn và không có dấu phân tách tuyên bố), mặc dù, là một cấu trúc lẻ-ish). –

4

Ruby diễn giải kết thúc dòng dưới dạng kết thúc câu lệnh. Các toán tử chỉ ra sự tiếp tục của một câu lệnh.

Bạn có thể sử dụng dấu chéo ngược \ để chỉ ra sự tiếp nối cũng vì vậy sau đây sẽ làm việc

items = (data['DELETE'] || data['delete'] \ 
    || data['GET'] || data['get'] || data['POST'] || data['post']) 
2

Vì ruby ​​là định hướng dòng, các câu lệnh kết thúc bằng toán tử được hiểu là không đầy đủ. Thêm dấu gạch chéo ngược sau toán tử sẽ cho phép diễn giải câu lệnh đa dòng một cách chính xác. (nguồn: http://phrogz.net/ProgrammingRuby/language.html)

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