receiver 和 引用的 问题

来源:4-1 类和接口

慕莱坞0998854

2022-11-26

老师你好,本节中有如下代码

val ageRef = Person::age
val person = Person(18,"bennyhuo")
val nameRef = person::name

两个问题:
1> 老师说ageRef没有绑定receiver,nameRef绑定了receiver,我原来以为receiver是针对于函数的概念(我暂时理解成JS里面的this指向),可是ageRef和nameRef也不是函数啊,为什么他们的set和get有receiver的概念,另外ageRef.set的时候为什么要传入receiver,它的receiver不就是ageRef吗?
2> 引用,到底什么是引用? 是C中类似于内存地址的概念吗?我们用nameRef的时候,为什么需要使用get和set?

为什么不是

something = nameRef // 获取nameRef的值
nameRef = "foo" // 设置nameRef的值
写回答

2回答

慕妹2253574

2023-02-22

//img.mukewang.com/szimg/63f4f67d09832d0315000883.jpg

可以看下反编译后的结果,应该就能理解了,应该是kotlin编译器生成了中间的类,中间类会持有receiver,对receiver进行取值赋值操作

0
1
慕妹2253574
kotlin 的 糖有点多,😓 跟着霍老师多看几遍多练几次多想就能知道了,加油
2023-02-22
共1条回复

bennyhuo

2022-11-28

  1. 这里的 receiver 是相对于属性说的,age 和 name 的访问都需要 receiver,也就是 Person 实例。直接用实例获取(person::name)属性引用,获取到的就是绑定了 receiver (也就是 Person 实例)的属性引用,使用类获取(Person::age)就是未绑定 receiver 的属性引用。

  2. 这个属性引用里面的引用,语义上与 C 的指针比较接近,都是指向某一个目标的值,但具体什么目标呢?C 当中的指针的语境下就是内存,Kotlin 这里的属性引用指向的就是属性。都是引用,但抽象层次不同。至于为什么要用 get set 而不是直接赋值,你如果知道 C 语言的指针,那么你也应该清楚,指针操作目标内存的时候,需要解引用,也就是说 int *p = &a,这里的 p 想要操作 a 的值,需要 *p = 1 这样写,而不是 p = 1。

0
0

学会Kotlin 突破开发语言瓶颈

如果有一门语言可以取代Java,那么它一定是Kotlin。

1760 学习 · 481 问题

查看课程