该let函数保证块内的值不会为空,即使另一个线程在块运行时更改了原始值......听起来不错,但它是如何做到的呢?
var user: User?
user?.let { it ->
// `user` can be null at this point, but not `it`.
}
Run Code Online (Sandbox Code Playgroud)
当该块运行时,编译器如何防止底层对象被释放?参考性强?关键部分?还有别的事吗?
它相当于将值复制到局部变量然后使用它。您的代码相当于:
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 内的它很可能为空。
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |