基本上这有什么区别
obj?.let{ doSomethingWith(it) }
这吗?
obj?.let{ doSomethingWith(obj) }
显然,仅通过阅读Kotlin文档,首选第一个,但是我发现了类似于第二个的代码,而我的IDE对此并不抱怨。有什么需要注意的“陷阱”,即使我没有被迫这么做,我也应该始终使用“ it”和“ this”吗?
答案 0 :(得分:4)
实际上,这与范围函数没有太大关系,而与null安全性更多。
如果obj
(object
不是一个好名字,因为它是Kotlin中的关键字)是一个值,则此代码将产生不必要的智能转换:
val obj: String? = null
obj?.let {
doSomethingWith(obj) // Smart cast to kotlin.String
}
在obj
是一个变量的情况下,正如注释中正确指出的那样,情况变得更糟,因为此代码可能不再是线程安全的。
这是安全的,但是:
obj?.let {
doSomethingWith(it)
}
由于it
是一个值,因此是不可变的。