2017-01-12 23 views
11

Dường như dòng cuối cùng của lambda luôn trả về giá trị đó ngay cả khi bạn bỏ qua câu lệnh return. Điều này có đúng không? Nó được ghi chép ở bất cứ nơi nào?Trả về ngầm từ lambda trong Kotlin

fun main(args: Array<String>) { 
    val nums = arrayOf(1, 2, 3) 
    val numsPlusOne = nums.map { it -> 
     val r = it + 1 
     r 
    } 
    // numsPlusOne = [2, 3, 4] 
} 
+2

Chỉ cần gợi ý hữu ích, bạn có thể rút ngắn thành 'val numsPlusOne = nums.map {it + 1}' (vì 'nó' được ngụ ý nếu không được chỉ định và nếu' it + 1' là dòng cuối cùng, kết quả sẽ được trả về khi @hotkey giải thích) –

Trả lời

24

Vâng, điều này đúng, nếu tuyên bố cuối cùng của lambda là biểu thức, nó được coi là giá trị trả về của nó.

Dưới đây là what the reference says (nhờ @KirillRakhman):

Chúng tôi có thể trở lại một cách rõ ràng giá trị từ lambda sử dụng cú pháp qualified return. Nếu không, giá trị của biểu thức cuối cùng sẽ được trả về. Do đó, hai đoạn sau là tương đương:

ints.filter { 
    val shouldFilter = it > 0 
    shouldFilter 
} 

ints.filter { 
    val shouldFilter = it > 0 
    [email protected] shouldFilter 
} 

Ngữ nghĩa tuyên bố cuối cùng cũng đúng đối với if (that's why there's no ternary operator), whentry-catch khối, và các báo cáo này là những biểu hiện bản thân:

val foo = if (bar) { 
    doSomething() 
    baz 
} else { 
    doSomethingElse() 
    qux 
} 

Xem thêm: examples for when and try-catch.

Vì vậy, lambdas nhất quán với cấu trúc ngôn ngữ theo khía cạnh này.


Nếu bạn muốn thực hiện một return tuyên bố rõ ràng trong một lambda, sử dụng [email protected] syntax (còn, another answer with examples). Không gắn nhãn return, ngược lại, làm việc với fun gần nhất (bỏ qua lambdas) và do đó chỉ có thể xảy ra trong các lambda đó là inlined.

Có một số language proposal để thêm cú pháp đặc biệt cho phát ra giá trị từ khối mã nhưng bị từ chối.

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