Rust的特征对象

news2024/9/22 11:36:42

文章目录

  • Rust的特征对象
    • 前言
    • 在屏幕上绘制各种UI组件

Rust的特征对象

前言

  • 特征对象不像泛型和impl trait这种零成本抽象,特征对象是在runtime时确定具体类型,有一定的性能开销。
  • 当我们需要函数参数是一类实现了特定trait的类型时,这时候就要使用特征对象
  • 特征对象形式:dyn,可使用&dyn或者Box<dyn>这种形式
  • 特征对象和oop语言中的继承很相似,因为Rust没有继承(现代的编程语言如Rust,Go都没有继承,它们认为继承是一种过度设计,被抛弃了)

在屏幕上绘制各种UI组件

首先定义了Button和SelectBox类型,他们都具有Draw特性。然后Screen的components组件包含了所有的UI组件(即实现了Draw特征的类型),重点就是这个Box<dyn Draw>

// 特征对象
struct Button {
    height: i32,
    width: i32,
    label: String,
}
struct SelectBox {
    height: i32,
    width: i32,
    options: Vec<String>,
}
trait Draw {
    fn draw(&self);
}
impl Draw for Button {
    fn draw(&self) {
        // 绘制button
        println!("绘制button, height: {}, width: {}, label: {}", self.height, self.width, self.label);
    }
}
impl Draw for SelectBox {
    fn draw(&self) {
        // 绘制selectbox
        println!("绘制selectbox, height: {}, width: {}", self.height, self.width);
    }
}
struct Screen {
    components: Vec<Box<dyn Draw>>,
}
impl Screen {
    fn run(&self) {
        for c in self.components.iter() {
            c.draw();
        }
    }
}
fn main() {
    let screen = Screen {
        components: vec![
            Box::new(Button {
                height: 50,
                width: 50,
                label: "xwphs".to_string(),
            }),
            Box::new(SelectBox {
                height: 30,
                width: 10,
                options: vec![String::from("yes"), String::from("no"), String::from("maybe")],
            }),
        ]
    };
    screen.run();
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4个Camtasia2023隐藏新功能,99%的人都不知道!

在今年5月&#xff0c;全能录屏软件 Camtasia 迎来了2023新版&#xff0c;带来非常多新功能&#xff0c;让制作录屏视频的效果再上一层楼&#xff01;所有购买过旧版 Camtasia 的老用户&#xff0c;都可以享受优惠升级。 Camtaisa 获取&#xff1a; http://souurl.cn/YWkrO7 更…

【Java高级语法】(六)内部类Inner Class:这可能是史上最全的关于内部类的学习资料~

Java高级语法详解之包装类 :one: 概念:two: 优缺点:three: 使用2.1 成员内部类2.2 局部内部类2.3 匿名内部类2.4 静态内部类2.5 小结&#xff1a;外部类访问四种内部类的特点2.6 小结&#xff1a;其他类访问四种内部类的特点 :four: 内部类与外部类的关系:five: 应用场景:six: …

云贝餐饮连锁独立版 v2.6.1+公众号+小程序端+抖音端端+全插件免授权版安装配置教程

云贝餐饮系统应该持续做好多年了&#xff0c;以前的版本都需要授权一直没使用&#xff0c;优选源码网整体测试下感觉从体验上还有逻辑设计上都非常不错&#xff0c;首页、会员中心支持DIY装修&#xff0c;配送支持多种平台对接&#xff0c;基本上餐饮行业需要的功能都能满足了。…

收件地址解析成 省+市+区+详细地址的形式

项目中的源代码在我的GitHub&#xff1a;https://github.com/weitw/address-analyzer 先看效果&#xff1a; 如上图&#xff0c;address数输入的地址&#xff0c;Address对象是解析后的地址。可以支持逆推上一级&#xff0c;且支持地址白话解析。 一、项目介绍 1、解析规则 …

13年测试老鸟,带你详探服务端的接口测试,测试内卷之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 服务器的接口测试…

Tinywebserver项目运行(docker部署mysql)

. 运行项目运行时遇到的一些其他问题重启mysql容器时发现端口被占用 前言 Tinywebserver是github上一个十分优秀的开源项目&#xff0c;帮助初学者学习如何搭建一个服务器. 本文讲述如何在使用docker部署mysql容器的情况下跟该项目进行连接并将项目运行起来&#xff0c;而不是…

萌萌哒的八戒1

拿到了一个图片&#xff0c;根据图片下方的字符&#xff0c;结合远古时期这个提示&#xff0c;想到了古典密码里的猪圈密码 挨个输入得到when the pig want to eat,套上flag

PyTorch 深度学习 || 2. 全连接网络 | Ch2.3 PyTorch 全连接自编码网络的无监督学习

PyTorch 全连接自编码网络的无监督学习 文章目录 PyTorch 全连接自编码网络的无监督学习1. 数据去噪1.1 计算库和数据准备工作1.2 构建自编码网络1.3 调用主函数1.4 可视化 2. 数据的重建与降维2.1 计算模块和数据的准备2.2 自编码网络数据准备2.3 自编码网络的构建2.4 自编码网…

深入理解程序的结构

文章目录 前言一、程序的组成二、未初始化和初始化变量保存地址三、栈什么时候被创建四、内存映射段总结 前言 本篇文章我们来深入的理解一下理解程序的结构。 一、程序的组成 通常情况下&#xff0c;一个可执行程序由以下几个不同的段组成&#xff1a; 1.代码段 (Text Seg…

怎么针对微服务架构做单元测试?

Martin Fowler 是国际著名的软件专家&#xff0c;敏捷开发方法的创始人之一&#xff0c;现为 ThoughtWorks 公司的首席科学家。在面向对象分析设计、UML、模式、软件开发方法学、XP、重构等方面&#xff0c;都扮演着举足 什么是微服务&#xff1f; 微服务的由来 微服务的前身…

笑谈之传统行业的软件测试

最近进入一传统企业做O2O社区&#xff0c;在里面&#xff0c;项目管理一团混乱&#xff0c;上层对软件测试的理解更是匮乏。今天没有技术&#xff0c;仅是对这些现象的吐槽。当然我相信传统行业不都是这样&#xff0c;所以大家仅当笑谈。 产品经理写的需求文档永远是拿来作为做…

cas单点登录 前端步骤流程

CAS&#xff08;Central Authentication Service&#xff09;是一个开源的单点登录协议和实现&#xff0c;它提供了一种统一的方法来管理和验证用户身份&#xff0c;使用户只需通过一次登录即可访问多个应用程序。CAS 单点登录的工作原理是基于服务提供者 (Service Provider) 和…

MNIST机器学习入门

引入所需库 import osimport cv2 import matplotlib.pyplot as plt import numpy as np import pandas as pd import tensorflow as tf from PIL import ImageMNIST数据集 下载MNIST数据集 mnisttf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) mnist.load_…

【干货】Android系统定制基础篇:第七部分-Android OTA升级(系统、应用)

OTA升级应用 项目地址&#xff1a;https://github.com/aystshen/Android-RomUpgrade. 这是一个负责 Android OTA 升级的后台应用&#xff0c;开机后自动运行后台 Service&#xff0c;支持系统升级和应用升级&#xff0c;支持本地升级&#xff08;tf卡、u盘&#xff09;和在线升…

数据库系统概述——第一章 绪论(知识点复习+练习题)

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 &#x1f99a;专栏&#xff1a;数…

Qt 每月收支计算

Qt 每月收支计算&#xff0c;针对每月有支出&#xff08;房贷、车贷、花呗、借呗&#xff09;的情况&#xff0c;计算收支明细&#xff0c;直观看到未来的个人经济情况&#xff0c;培养良好的消费习惯&#xff0c;进行理性的财富支配&#xff0c;量入为出。 #include "mai…

云安全技术(三)之云计算相关的安全概念

云计算相关的安全概念 Security Concepts Relevant to Cloud Computing 1. 密码学和密钥管理 Cryptography and key management 1、加密技术: 有许多不同类型和等级的加密技术。在云环境中&#xff0c;云安全专家有责任评价应用程序的需求、所使用的技术、需要保护的数据类型&…

【UE 从零开始制作坦克】5-通过旋转摄像机控制炮塔旋转

效果 步骤 打开动画蓝图“ABP_West_Tank_M1A1Abrams” 我们在动画图表中可以发现控制坦克炮塔旋转和炮管旋转的变量分别是“TurretRotation”和“GunRotattion”&#xff0c;因此只需改变这两个旋转体的值即可控制炮塔和炮管的旋转。 切换到事件图表中&#xff0c;首先通过“T…

单向散列函数【密码学】(一)

目录 一、前言&#xff1a;密码学有什么用&#xff1f; 二、单向散列函数 1、单向函数 2、散列函数 3、单向散列函数 三、怎么解决完整性问题 四、如何设置合适的安全强度 一、前言&#xff1a;密码学有什么用&#xff1f; 二、单向散列函数 单向散列函数就是用来解决…

article-6-pss 并联六自由度机构轨迹规划

建模 ** [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-djltxj90-1687070335773)(data:image/svgxml;utf8, )] ** 程序如下&#xff1a; % clc % clear all % function []PSS1(XP,YP,ZP) tic %%%%%鍒濆浣嶇疆鐨勪綅濮?%%%%% % XP 0; %鍔ㄥ钩鍙…