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
可以看下反编译后的结果,应该就能理解了,应该是kotlin编译器生成了中间的类,中间类会持有receiver,对receiver进行取值赋值操作
012023-02-22 -
bennyhuo
2022-11-28
这里的 receiver 是相对于属性说的,age 和 name 的访问都需要 receiver,也就是 Person 实例。直接用实例获取(person::name)属性引用,获取到的就是绑定了 receiver (也就是 Person 实例)的属性引用,使用类获取(Person::age)就是未绑定 receiver 的属性引用。
这个属性引用里面的引用,语义上与 C 的指针比较接近,都是指向某一个目标的值,但具体什么目标呢?C 当中的指针的语境下就是内存,Kotlin 这里的属性引用指向的就是属性。都是引用,但抽象层次不同。至于为什么要用 get set 而不是直接赋值,你如果知道 C 语言的指针,那么你也应该清楚,指针操作目标内存的时候,需要解引用,也就是说 int *p = &a,这里的 p 想要操作 a 的值,需要 *p = 1 这样写,而不是 p = 1。
00
相似问题