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之后,就不知道原来具体是什么类型了。

posted @ 2023-04-19 01:10  wenli7363  阅读(69)  评论(0编辑  收藏  举报