首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >instance.let和instance?.let有什么区别?

instance.let和instance?.let有什么区别?
EN

Stack Overflow用户
提问于 2020-11-24 12:37:47
回答 1查看 54关注 0票数 0

两行代码之间有什么区别:

1.

代码语言:javascript
复制
 viewHolderRef?.get()?.adapterPosition.let {
代码语言:javascript
复制
viewHolderRef?.get()?.adapterPosition?.let

我知道它可能会影响lambda表达式得到的参数的类型,但我的意思是,在其中一个表达式中let将运行,而在第二个已知中(引用null问题),是否存在这样的情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-24 13:16:48

v?.let的意思是:如果vnull,那么只需使整个表达式null ( let方法甚至不会被调用,因为它将提前终止),如果它不是null,那么将表达式的类型更改为非空,然后继续使用属性链。因此,v?.let只会在v为非空的情况下调用函数。

相反,v.let将始终调用let,不管v是否为null,因此参数是可空的(因为不能保证它不像v?.let那样为null。这种区别最好用下面的代码来展示:

代码语言:javascript
复制
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")
}

操场链接

这一产出如下:

代码语言:javascript
复制
v.let: null
----------
v.let: foo
v?.let: foo

如您所见,在对null输出调用它时,只有v.let运行并打印null,而对于非空输出,两个let语句都运行。您还可以看到参数类型的不同:v.let接受String?,而v?.let接收String

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64986676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档