2011-08-26 31 views
16

Những gì tôi đang cố gắng để làm:Ruby: Cú pháp có điều kiện nhiều dòng: làm cách nào để thực hiện?

result = (not question?) \ 
      and (\ 
      condition \ 
      or (\ 
       comparer == compared and another_question? \ 
      ) \ 
     ) 

Mục đích là để có phức tạp và/hoặc logic và vẫn còn có nó có thể đọc được.

Vấn đề với cú pháp đã cố gắng ở trên là một số cách làm hỏng dấu ngoặc đơn trong trình phân tích cú pháp của ruby, do đó bàn điều khiển cho biết lỗi nằm trong tệp mà mã này không có trong đó (mặc dù nó nằm trong ngăn xếp cuộc gọi)

mà không có dấu gạch chéo lại, tôi có được những:

syntax error, unexpected kAND, expecting kEND (SyntaxError) 

syntax error, unexpected kOR, expecting ')' 

bất kỳ ý tưởng về cách làm đúng cách này?

+0

Trong mẫu, có một dấu cách sau 'another_question? \ '. Không gian tồn tại trong mã ban đầu? – outis

+0

vâng không gian có quan trọng không? – NullVoxPopuli

+0

Rất nhiều. "\" thoát ký tự sau. – outis

Trả lời

18

Xóa dấu cách sau dấu gạch chéo ngược trong another_question? \. Bạn đang thoát khỏi không gian thay vì dòng mới, gây ra lỗi cú pháp.

Lưu ý bạn không cần phải thoát khỏi mọi dòng mới.

result = (not question?) \ 
      and (
      condition \ 
      or (
       comparer == compared and another_question? 
      ) 
     ) 
8

Đảm bảo mỗi dòng (ngoại trừ dòng cuối cùng) kết thúc bằng toán tử để trình thông dịch "biết" sẽ có nhiều toán hạng sắp tới, ví dụ:

result = (not question?) and (
       condition or 
       (comparer == compared and another_question?) 
     ) 

(thử nghiệm với MRI 1.8.7)

+0

là không có cách nào để có các nhà khai thác trên một dòng mới? – NullVoxPopuli

+2

@ TheLindyHop: Có, che dấu ngắt dòng bằng dấu gạch chéo ngược ;-) Tôi không biết các khả năng khác. Có lẽ bạn có thể làm lại mã để tránh các biểu thức logic quá phức tạp? –

8

Hãy thử điều này:

sub = (comparer == compared and another_question?) 
result = (not question?) and (condition or sub) 

Không cần phải làm cho toàn bộ điều một biểu thức.

+1

Tôi có xu hướng phá vỡ các biểu thức boolean dài thành các phương thức đặt tên (và ủy quyền) các khía cạnh của biểu thức, gán các tên có thể đọc được thể hiện những gì đang được thử nghiệm. – d11wtq

+1

@ d11wtq Một phương pháp đường không thể đọc được! Hãy tưởng tượng quay trở lại mã của bạn và nhìn thấy hàng tá phương thức trong một câu lệnh if, và phải theo dõi từng phương thức để tìm ra nó.Phương pháp chỉ nên được trích xuất nếu chúng sẽ được sử dụng ở nhiều vị trí. – Chloe

11

Đối với biểu thức logic, bạn nên sử dụng &&, ||, !, không and, or, not.

and, or, not chỉ nên được sử dụng cho luồng kiểm soát.

Một lý do là &&, ||, ! có ưu tiên cao hơn and, or, not.

Đọc thêm về điều này trong this blog post.

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