let函数如何保证值不会为空?

ale*_*kop 2 kotlin

let函数保证块内的值不会为空,即使另一个线程在块运行时更改了原始值......听起来不错,但它是如何做到的呢?

var user: User?

user?.let { it ->
  // `user` can be null at this point, but not `it`.
}
Run Code Online (Sandbox Code Playgroud)

当该块运行时,编译器如何防止底层对象被释放?参考性强?关键部分?还有别的事吗?

Ten*_*r04 5

它相当于将值复制到局部变量然后使用它。您的代码相当于:

val it = user
if (it != null) {
  // `user` can be null at this point, but not `it`.
}
Run Code Online (Sandbox Code Playgroud)

但仅限it于 lambda 的范围。所以,是的,它创造了一个强有力的参考。

顺便说一句,它仅it在使用空安全调用时保证不为空?.。如果您对可空值使用标准.let调用,则 lambda 内的它很可能为空。