rust特征对象(代码片段)

不想再做笨蛋了 不想再做笨蛋了     2023-04-19     256

关键词:

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

rust特征对象(代码片段)

...语法真丑啊....看完trait之后,我整个人都不好了,然后看特征对象的时候,我人是比较懵逼的。0概述特征对象:指向实现了某个特征的一系列实例。这种映射关系存在一张表内(vtable),可以在运行时通过特征对象找到具体调用的... 查看详情

rust学习教程26-特征对象(代码片段)

...家加入Rust编程学院,一起学习交流:QQ群:1009730433特征对象在上一节中有一段代码无法通过编译:fnreturns_summarizable(switch:bool)->implSummaryifswitchPost//...elseWeibo//...其中Post和Weibo都实现了Summary特征,因此上面的函数试图通... 查看详情

rust语言圣经26-特征对象(代码片段)

...的Rust学习社区官网:https://college.rsQQ群:1009730433特征对象在上一节中有一段代码无法通过编译:fnreturns_summarizable(switch:bool)->implSummaryifswitchPost//...elseWeibo//...其中Post和Weibo都实现了Summary特征,因此上面的函数试图通... 查看详情

rust学习教程27-深入了解特征(代码片段)

...t编程学院,一起学习交流:QQ群:1009730433深入了解特征特征之于Rust更甚于接口之于其他语言,因此特征在Rust中很重要也相对较为复杂,我们决定把特征分为两篇进行介绍,第一篇在之前已经讲过,现在就... 查看详情

rust学习教程27-深入了解特征(代码片段)

...t编程学院,一起学习交流:QQ群:1009730433深入了解特征特征之于Rust更甚于接口之于其他语言,因此特征在Rust中很重要也相对较为复杂,我们决定把特征分为两篇进行介绍,第一篇在之前已经讲过,现在就... 查看详情

rust极简教程(代码片段)

目录简介特性特征用途安装核心组件常用命令基础语法数据类型标量类型复合类型示例条件语句循环输出&输入输出输出花括号输出非基础类型输入所有权切片结构体枚举MatchIf-letOption集合vector容器String代码组织命名空间访问... 查看详情

rust学习教程25-特征trait(代码片段)

...家加入Rust编程学院,一起学习交流:QQ群:1009730433特征Trait如果我们想定义一个文件系统,那么把该系统跟底层存储解耦是很重要的。文件操作主要包含三个:open、write、read,这些操作可以发生在硬盘,也可以... 查看详情

rust学习教程25-特征trait(代码片段)

...家加入Rust编程学院,一起学习交流:QQ群:1009730433特征Trait如果我们想定义一个文件系统,那么把该系统跟底层存储解耦是很重要的。文件操作主要包含三个:open、write、read,这些操作可以发生在硬盘,也可以... 查看详情

rust语言圣经27-深入了解特征(代码片段)

...社区官网:https://college.rsQQ群:1009730433深入了解特征特征之于Rust更甚于接口之于其他语言,因此特征在Rust中很重要也相对较为复杂,我们决定把特征分为两篇进行介绍,第一篇在之前已经讲过,现在就是... 查看详情

rust语言圣经25-特征trait(代码片段)

...的Rust学习社区官网:https://college.rsQQ群:1009730433特征Trait如果我们想定义一个文件系统,那么把该系统跟底层存储解耦是很重要的。文件操作主要包含三个:open、write、read,这些操作可以发生在硬盘,也可以发... 查看详情

rust语言圣经23-方法method(代码片段)

...法的联动使用不同,Rust的方法往往跟结构体、枚举、特征一起使用,特征将在后面几章进行介绍。定义方法Rust使用impl来定义方法,例如以下代码:structCirclex:f64,y:f64,radius:f64,implCircle//new是Circle的关联函数,因为它... 查看详情

rust编程语言入门之rust的面向对象编程特性(代码片段)

Rust的面向对象编程特性一、面向对象语言的特性Rust是面向对象编程语言吗?Rust受到多种编程范式的影响,包括面向对象面向对象通常包含以下特性:命名对象、封装、继承对象包含数据和行为“设计模式四人帮”在《设计模型... 查看详情

rust-方法`draw`存在,但在vec<box<dyntrait>>中不满足以下特征范围,compilernote应该满足吗?(代码片段)

Thisquestionalreadyhasananswerhere:Traitimplementationforbothatraitobjectandfordirectimplementorsofthetrait(1个答案)3个月前关闭。PlaygroundMyCode使用另一个库'Their...'-特别需要的是'TheirShadow'。我正在尝试从MyDra 查看详情

Rust Trait 对象转换

...;amp;self和&amp;Any都是指针,并且该操作不需要知道实现特征的结构的 查看详情

rust下根据protobuf的消息名创建对象实例(代码片段)

在C++里面,我们可以根据一个消息的名称,动态的创建一个实例123456google::protobuf::Descriptor*desc=    google::protobuf::DescriptorPool::generated_pool()        ->FindMessageTypeByName("mypkg.MyType");googl 查看详情

rust内存管理(代码片段)

...引入了一套在编译期间,通过静态分析的方式,确定所有对象的作用域与生命周期,从而可以精确的在某个对象不再被使用时,将其销毁,并且不引入任何运行时复杂度。现代编程语言,对于堆上分配的内存(可以理解为 mal... 查看详情

Rust 特征边界与类型

】Rust特征边界与类型【英文标题】:Rusttraitboundswithtypes【发布时间】:2020-08-1700:05:39【问题描述】:我在阅读hyperium/http源代码,发现this:pubfnput<T>(uri:T)->BuilderwhereUri:TryFrom<T>,<UriasTryFrom<T>>::Error:Into<crate::Err 查看详情

rust学习教程23-方法method(代码片段)

...院,一起学习交流:QQ群:1009730433方法Method从面向对象语言过来的同学对于方法肯定不陌生,class里面就充斥着方法的概念,在Rust中方法的概念也大差不差,往往和对象成对出现:object.method()例如读取一个文件写 查看详情