ilya.gorbunov
10/31/2016, 3:22 PMx?.let { y ->
doSomeNetworkCall(
{
response -> x?.doSomething() // x could be null here, but y couldn't
}
)
}
The outermost lambda is inlined, because let is inline function, but the innermost is not, as doSomeNetworkCall is not inline (as I suppose).
So the innermost lambda is represented as an anonymous class instance, which holds references captured in the closure.
If x is a nullable property of some object, the closure captures instance of that object, so you could get it's x property value later, and the value of that property could become null at that point.
And y is a local non-nullable val, and after it's captured in closure, you can still be sure that it remains not null in that closure.