2011-12-09 26 views
14

sau đây hai mã tạo ra kết quả khác nhau:"trở lại" và "try-catch-cuối cùng" đánh giá khối trong scala

def x = try{ 
    true 
} finally false 

invoke x được true

def y:Boolean = try{ 
    return true 
} finally { 
    return false 
} 

gọi y được false

phiên bản return hoạt động giống như Java.

Cá nhân tôi không bao giờ sử dụng 'trả lại' trong scala. Nhưng thật tốt khi biết cách scala đánh giá giá trị của một khối try-catch-finally. Cảm ơn.

Trả lời

13

Bạn should not có một câu lệnh trả về trong một khối cuối cùng (mặc dù nó được cho phép về mặt kỹ thuật, ít nhất là trong Java, C# chẳng hạn cấm nó).

Nếu Scala cuối cùng chặn có lợi nhuận tiềm ẩn, điều đó sẽ luôn che dấu giá trị trả về dự định. Vì vậy, không có ý nghĩa.

Nhưng tôi cho rằng nó không thể giúp bạn nếu bạn viết một cách rõ ràng theo cách đó.

+0

Nhưng "lợi nhuận tiềm ẩn" là gì? – xiefei

+0

"Trả về tiềm ẩn": Có thể là từ sai, nhưng ý tôi là Scala sử dụng kết quả của dòng cuối cùng trong khối mã làm giá trị trả về cho khối. – Thilo

+2

Thilo là đúng. Đặt câu lệnh 'return' trong một khối' cuối cùng' sẽ được coi là một sai lầm và thực sự không được phép. 'Cuối cùng' là để làm sạch công cụ không có vấn đề cho dù cơ thể phương pháp thành công hoặc ném một ngoại lệ. Nó không phải là nơi để quyết định một giá trị trả lại! Do đó, phần thân của mệnh đề 'finally' được lấy để đánh giá' Đơn vị'. Trong ví dụ đầu tiên của bạn, 'false' được chuyển đổi hoàn toàn thành' Đơn vị'. –

9

Theo ngôn ngữ đặc tả Scala:

Một thử biểu try {b} cuối cùng e đánh giá khối b. Nếu đánh giá của b không gây ra một ngoại lệ được ném, biểu thức e được đánh giá. Nếu ngoại lệ được ném trong khi đánh giá e, việc đánh giá biểu thức thử bị hủy bỏ với ngoại lệ được ném. Nếu không có ngoại lệ được ném trong quá trình đánh giá e, kết quả của b được trả về do kết quả của biểu thức thử.

Hành vi này có vẻ trái với thông số đó. Tôi đoán rằng, vì 'return' gây ra một sự trở lại ngay lập tức từ hàm , kết quả này sẽ ghi đè hành vi tiêu chuẩn cho một khối thử. Ví dụ chiếu sáng là:

def z : Boolean = { 
    val foo = try { true } finally { return false } 
    true 
} 

Gọi z trả về false.

+3

Có, quay trở lại từ điều khiển luồng ngắt cuối cùng. Nó nên bị cấm. – Thilo

+11

'return' luôn ngắt kiểm soát luồng. Nó chỉ trở nên đặc biệt kỳ lạ trong trường hợp đó. – Debilski

+0

Nó theo thông số kỹ thuật. Đoạn sau đây nói rằng kiểu 'e' được mong đợi là phù hợp với' Đơn vị', nghĩa là 'e' chỉ được đánh giá cho các tác dụng phụ của nó. Khi 'e' là' trả về ..', các quy tắc đánh giá nói rằng luồng điều khiển rời khỏi phương thức được thực hiện hiện tại, trả về đối số đã cho. –

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