2012-10-17 24 views
13

Trong Groovy, các return statement is optional, cho phép bạn viết các phương pháp như:Groovy của "tùy chọn trở lại" ngữ nghĩa

def add(a, b) { 
    a + b 
} 

... mà thêm ab và trả về kết quả cho người gọi.

Tuy nhiên, tôi tự hỏi ngữ nghĩa là gì khi phương thức có nhiều câu lệnh "trả về". Ví dụ, trong Java bạn có thể có:

String append(String a, String b) { 
    if (a == null) { 
     return b; 
    } 
    return a + b; 
} 

Điều này có thể (giả định) được dịch sang Groovy như:

def append(a, b) { 
    if (! a) { 
     b 
    } 
    a + b 
} 

Tuy nhiên, trong trường hợp này, như thế nào Groovy biết rằng b bên trong if tuyên bố phải được trả lại? Hay không? Tôi cho rằng Groovy không thể xử lý bất kỳ câu lệnh nào mà kết quả của nó không được sử dụng như là một return, đúng không? Có bất kỳ ngữ nghĩa được xác định rõ ràng nào về cách hoạt động của tính năng "tùy chọn trả về" trong trường hợp này không?

+0

Chỉ cần thông báo, liên kết bạn tham chiếu bị hỏng. – jmreicha

+0

@jmreicha - Cảm ơn, đã sửa. – aroth

Trả lời

25

Trang bạn liên kết (chứ không phải ngắn gọn) mô tả ngữ nghĩa chính xác:

Chú ý rằng câu lệnh return là tùy chọn ở phần cuối của phương pháp.

Vì vậy, b trong đó if khối sẽ không bao giờ được trả lại trừ khi bạn trả lại rõ ràng. Trên thực tế điều này có nghĩa rằng giá trị trả về sẽ là kết quả của báo cáo kết quả cuối cùng đánh giá, vì vậy nếu ví dụ của bạn là

def append(a, b) { 
    if (!a) { b } 
    else { a + b } 
} 

Sau đó, kết quả sẽ là b nếu !atruea + b khác.

Kết quả của một cuộc gọi đến một hàm voidnull, vì vậy nếu ví dụ là

def append(a,b) { 
    if (!a) { b } 
    else { a + b } 
    println "debug: $a $b" 
} 

Sau đó append sẽ luôn luôn trả null.

Quy tắc chung của riêng tôi cho điều này là luôn sử dụng câu lệnh trả về rõ ràng nếu phương thức hoặc đóng có chứa nhiều câu lệnh. Tôi nghĩ dựa vào câu lệnh trả về tiềm ẩn trong các phương thức phức tạp hơn là nguy hiểm vì nếu ai đó thêm một dòng vào cuối phương thức, họ sẽ thay đổi giá trị trả về mặc dù chúng có nhiều khả năng không có ý định.

+2

Làm cho tinh thần. Mặc dù nếu tôi đã làm 'else {a + b}' thì sao? Trong trường hợp đó, 'b' sẽ là" kết thúc "của phương thức, bởi vì sẽ không có các câu lệnh thực thi nào theo sau nó. – aroth

+0

Tôi đã thêm một vài ví dụ bổ sung để xây dựng dựa trên ý nghĩa của ngữ nghĩa trả về tùy chọn trong thực tế. –

+0

Điều này hóa ra lại là một câu hỏi tinh tế hơn so với lần đầu tiên tôi cho nó tín dụng. Thanh danh. –

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