2013-06-10 31 views
5

Chạy sau đây trong một 1,8 console:thẻ tại sao bất ngờ: * trong khi thực hiện thao tác trên hai dòng

def accessories = null 
final int prime = 31; 
int result = 1; 
result = prime 
    * result 
     + ((accessories == null) ? 0 : accessories 
       .hashCode()); 

tôi nhận được một lỗi biên dịch nêu:

dấu hiệu bất ngờ: * tại dòng: 5, cột: 13

Tuy nhiên, khi tôi di chuyển "* result" lên dòng trước đó, nó biên dịch và chạy một cách rõ ràng. Tôi đã tìm kiếm để tìm một lời giải thích, nhưng đã không có may mắn cho đến nay. Ai đó có thể giải thích?

def accessories = null 
final int prime = 31; 
int result = 1; 
result = prime * result 
     + ((accessories == null) ? 0 : accessories 
       .hashCode()); 

Trả lời

6

Bởi vì các câu lệnh của Groovy không bị giới hạn bởi ;, mà là do ngắt dòng. Nó không thể biết dòng dưới đây là một sự tiếp nối của tuyên bố trên dòng trên. Bạn có thể thoát khỏi ngắt dòng:

int i = 10 \ 
    * 9 
assert i == 90 

Cập nhật:

Trên thực tế Groovy không xác định một số báo cáo, kể từ dòng trên. Ít nhất là chấm được công nhận:

assert [1, 2] 
    .join("") 
    .padLeft(4, "a") == "aa12" 

Và một tuyên bố với một trong hai +, -~ (và có thể nhiều hơn) could be methods:

def m = "aa" 
    - m // fails with "No signature of method: java.lang.String.negative()" 
+1

Bạn chỉ cần nhấn móng tay trên đầu. :-) – dmahapatro

2

Bạn chỉ cần di chuyển * thay vì di chuyển * result để lót 4.

result = prime //Line completes with the assignment of prime to result 
     * result //Will yield a compilation error 
      + ((accessories == null) ? 0 : accessories 
        .hashCode()); 

Thay vào đó,

result = prime * //Statement expects a RHV (right hand value) for the operator 
      result + //Always end the line with an operator 
      ((accessories == null) ? 0 : accessories 
        .hashCode()); 

Để kiểm tra cùng với ternary điều hành,

//Yields to compilation error 
def str = "ABC"    
def val = str == "ABC" 
? str 
: "XYZ" 

//Works perfect 
def val = str == "ABC" ? 
str : 
"XYZ" 
+1

Đây không phải là câu hỏi của tôi. Câu hỏi của tôi là "tại sao điều này là cần thiết" không phải là cách giải quyết nó. Tôi đã suy luận điều đó. Cảm ơn bạn đã phản hồi. –

+0

@BillTurner "Tại sao cần thiết" được đề cập dưới dạng nhận xét trong các dòng có liên quan. – dmahapatro

3

này là cần thiết vì nếu không phân tích cú pháp cho Groovy sẽ phải làm nhiều việc hơn.

Có rất nhiều nơi tức là:

String s = "tim" 
      + "_yates" 

đâu nó sẽ có thể cho phân tích cú pháp để tìm ra những gì bạn có nghĩa là, nhưng trong tất cả trong số họ, tôi tin rằng nó sẽ bao gồm backtracking (hoặc thực hiện một hai phân tích cú pháp) chậm chậm

+0

+1, không biết về backtracking trong phân tích cú pháp ... Không làm tôi biết rất nhiều về phân tích cú pháp, cũng :-) – Will

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