instance.let 和 instance 有什么区别?.let
What is the difference between instance.let and instance?.let
两行代码有什么区别:
1.
viewHolderRef?.get()?.adapterPosition.let {
viewHolderRef?.get()?.adapterPosition?.let
我知道它会影响 lambda 表达式得到的参数类型,但我的意思是不同的是,有没有一种情况,在一个表达式中 let 将 运行 而在第二个表达式中知道(参考null问题)
v?.let
的意思是:如果v
是null
,那么就让整个表达式null
(甚至不会调用let
方法因为它会提前终止),如果它不是 null
,则将表达式的类型更改为不可为空,然后继续使用 属性 链。因此,v?.let
将仅在 v
为非空时调用该函数。
相反,v.let
会总是调用let
,不管v
是否为null,所以参数可以为空(因为不能保证它不会像 v?.let
那样为 null。这段代码最好地证明了区别:
fun test(v: String?) {
v.let { it: String? -> println("v.let: $it") }
v?.let { it: String -> println("v?.let: $it") }
}
fun main () {
test(null)
println("----------")
test("foo")
}
这输出:
v.let: null
----------
v.let: foo
v?.let: foo
如您所见,在 null
输出上调用它时,仅 v.let
运行s 并打印 null
,而在非空输出上,两个 let
语句 运行。您还可以看到参数类型的差异:v.let
接受 String?
,而 v?.let
接受 String
.
两行代码有什么区别:
1.
viewHolderRef?.get()?.adapterPosition.let {
viewHolderRef?.get()?.adapterPosition?.let
我知道它会影响 lambda 表达式得到的参数类型,但我的意思是不同的是,有没有一种情况,在一个表达式中 let 将 运行 而在第二个表达式中知道(参考null问题)
v?.let
的意思是:如果v
是null
,那么就让整个表达式null
(甚至不会调用let
方法因为它会提前终止),如果它不是 null
,则将表达式的类型更改为不可为空,然后继续使用 属性 链。因此,v?.let
将仅在 v
为非空时调用该函数。
相反,v.let
会总是调用let
,不管v
是否为null,所以参数可以为空(因为不能保证它不会像 v?.let
那样为 null。这段代码最好地证明了区别:
fun test(v: String?) {
v.let { it: String? -> println("v.let: $it") }
v?.let { it: String -> println("v?.let: $it") }
}
fun main () {
test(null)
println("----------")
test("foo")
}
这输出:
v.let: null
----------
v.let: foo
v?.let: foo
如您所见,在 null
输出上调用它时,仅 v.let
运行s 并打印 null
,而在非空输出上,两个 let
语句 运行。您还可以看到参数类型的差异:v.let
接受 String?
,而 v?.let
接受 String
.