rust特征对象
rust语法真丑啊....
看完trait之后,我整个人都不好了,然后看特征对象的时候,我人是比较懵逼的。
0 概述
特征对象:指向实现了某个特征的一系列实例。
这种映射关系存在一张表内(vtable),可以在运行时通过特征对象找到具体调用的类型方法
可以通过 &
引用或者 Box<T>
智能指针的方式来创建特征对象。
注意 dyn 不能单独作为特征对象的定义,例如下面的代码编译器会报错,原因是特征对象可以是任意实现了某个特征的类型,编译器在编译期不知道该类型的大小,不同的类型大小是不同的。而 &dyn 和 Box
在编译期都是已知大小,所以可以用作特征对象的定义。
记录一个东西,怕明天忘记了。
为什么使用引用方式索引trait object,这个原因很好理解。
但是为什么还需要为每个具体的类型实例创建一个vtable。
我看圣经上说,这个引用的vptr(行为指针)会指向一个具体的方法表。虽说selecbox和button都实现了draw trait,但是要知道,不同结构体具体对draw trait的实现各有不同,所以具体实例都要有一个方法表。
对象安全部分
假设Draw特征的实例有button和selectbox,我定义了一个叫btn的trait object,此时,btn是Draw的特征对象实例,而不是button的实例,跟button没有关系了。我假设btn调用了draw trait中的某个方法,返回值是Self,这时就很尴尬了,因为不知道具体的返回类型(不能确定是button还是selectbox),所以这是不允许的/不安全的。
泛型参数也一样,转变成object之后,就不知道原来具体是什么类型了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步