2012-09-08 12 views
21

Thỉnh thoảng tôi thấy các đoạn mã Scala, với một số mức điều kiện và kết hợp lồng nhau, sẽ rõ ràng hơn nhiều bằng cách sử dụng trả về rõ ràng để thoát khỏi hàm.Có một số lý do để tránh các câu lệnh return

Có lợi ích nào trong việc tránh những tuyên bố trả về rõ ràng đó không?

+0

đây là bài đăng trên blog có liên quan trên [return] (https://tpolecat.github.io/2014/05/09/return.html) – BlueSky

Trả lời

17

Một returncó thể thực hiện bằng cách ném một ngoại lệ, vì vậy nó có thể một overhead nhất định so với cách tiêu chuẩn của tuyên bố kết quả của một phương pháp. (Cảm ơn Kim Stebel vì đã chỉ ra điều này không phải luôn luôn, có lẽ thậm chí không thường xuyên như vậy.)

Ngoài ra, return khi đóng cửa sẽ được trả về trong đó đóng cửa được xác định và không đơn giản từ chính nó. Điều đó làm cho nó vừa hữu ích cho điều đó, và vô ích khi trả lại kết quả từ việc đóng cửa.

Một ví dụ ở trên:

def find[T](seq: Seq[T], predicate: T => Boolean): Option[T] = { 
    seq foreach { elem => 
    if (predicate(elem)) return Some(elem) // returns from find 
    } 
    None 
} 

Nếu bạn vẫn không hiểu, elem => if (predicate(elem)) return Some(elem) là phương pháp apply của một đối tượng ẩn danh của mà thực hiện Function1 và được truyền cho foreach như tham số. Xóa return khỏi nó và nó sẽ không hoạt động.

+0

Trả về không phải lúc nào cũng được triển khai bằng ngoại lệ. Chỉ cần biên dịch một vòng lặp while đơn giản với một câu lệnh return trong nó và nhìn vào đầu ra với javap -v. Trong thực tế, tôi muốn xem bất kỳ ví dụ nào mà return _is_ được thực hiện theo cách đó. –

+0

@KimStebel Thú vị, tôi không biết Scala đã tối ưu hóa trường hợp đó. Ví dụ, chỉ cần nhìn vào mã trong câu trả lời của tôi. –

+0

Tôi chắc chắn understadn những gì bạn có nghĩa là khi bạn nói rằng một sự trở lại trên một clousure sẽ trở về từ phương pháp mà nó được xác định, và không phải từ itsefl clousure. Tôi đã bị đốt cháy với điều đó, như bạn đã giải thích ở đây http://stackoverflow.com/questions/11929485/scala-problems-with-return-statement – opensas

2

Một nhược điểm là loại trả về không thể suy ra được. Mọi thứ khác là vấn đề về phong cách. Những gì có vẻ không rõ ràng hoặc khó hiểu với bạn có thể hoàn toàn "tự nhiên" với người khác.

2

Trả lại rõ ràng sẽ phá vỡ luồng điều khiển. Ví dụ: nếu bạn có một tuyên bố như

if(isAuth(user)) { 
return getProfile(user) 
} 
else { 
return None 
} 

cấu trúc điều khiển (nếu) không được hoàn thành, đó là lý do tại sao tôi cho rằng điều này gây nhầm lẫn hơn. Đối với tôi, điều này là tương tự như một tuyên bố phá vỡ. Ngoài ra Scalas 'tất cả mọi thứ là một giá trị' nguyên tắc làm giảm nhu cầu sử dụng lợi nhuận rõ ràng dẫn đến người ít sử dụng một từ khóa mà chỉ hữu ích cho báo cáo def:

// start 
def someString:String = return "somestring" 

// def without return 
def someString = "somestring" 

// after refactoring 
val someString = "somestring"  

Bạn thấy rằng các loại chú thích đã được thêm vào và khi thay đổi def thành một val, nó được yêu cầu để loại bỏ sự trở lại.