当前位置: 首页 > news >正文

rust学习-any中的downcast和downcast_ref

背景

看rust官方文档,好奇Any和Go的Any是否是一回事,看到下文的一行代码,了解下它的功能

pub trait Any: 'static {// Required methodfn type_id(&self) -> TypeId;
}

std::any 用于 dynamic typing 或者 type reflection
模拟动态类型的trait。

大多数类型都实现 Any。但是,任何包含非静态引用的类型都不会。

use std::any::Any;fn main() {use std::any::{Any, TypeId};fn is_string(s: &dyn Any) -> bool {TypeId::of::<String>() == s.type_id()}assert_eq!(is_string(&0), false);assert_eq!(is_string(&"cookie monster".to_string()), true);
}

Any and TypeId

TypeId 代表一个全局唯一类型标识符
Any 本身可以用来获取 TypeId,并且当用作 Trait 对象时具有更多功能(used as a trait object)。

  • 作为 &dyn Any(借用的trait对象)
    它具有 is 和 downcast_ref 方法,用于测试包含的值是否属于给定类型(is of a given type),并获取对内部值的引用(get a reference to the inner value as a type)。
  • 作为 &mut dyn Any
    有 downcast_mut 方法,用于获取对内部值的可变引用(mutable reference)。 Box 添加向下转换方法,该方法尝试转换为 Box。

注意
&dyn Any 仅限于测试值是否属于指定的具体类型(alue is of a specified concrete type)
不能用于测试类型是否实现特征(a type implements a trait)。

Smart pointers 和 dyn Any

使用 Any 作为trait对象时要记住的一个行为,尤其是使用 Box 或 Arc 等类型时,只需对值调用 .type_id() 将生成容器的 TypeId(比如Box、Arc) ,而不是底层trait对象(simply calling .type_id() on the value will produce the TypeId of the container, not the underlying trait object)。

可以通过将智能指针转换为 &dyn Any 来避免这种情况,这将返回对象的 TypeId。

use std::any::{Any, TypeId};fn main() {let boxed: Box<dyn Any> = Box::new(3_i32);let boxed_any: &dyn Any = &Box::new(3_i32);// 对值调用 .type_id() 将生成容器的 TypeIdlet boxed_id = boxed.type_id();// 将智能指针转换为 &dyn Any 来避免这种情况,返回对象的 TypeIdlet boxed_any_id = boxed_any.type_id();// 但是你可能更期待这样let actual_id = (&*boxed).type_id();assert_eq!(boxed_id, TypeId::of::<Box<dyn Any>>()); // Box<dyn Any>assert_eq!(boxed_any_id, TypeId::of::<Box<i32>>()); // Box<i32>assert_eq!(actual_id, TypeId::of::<i32>());         // i32
}

考虑一种情况,要打印(log out)传递给函数的值。已知道正在处理的值实现 Debug(the value we’re working on implements Debug),但不知道它的具体类型。
同时又希望对某些类型给予特殊处理:在这种情况下,先打印 String 值的长度,再打印它们的值(print out the length of String values prior to their value.)。在编译时不知道值的具体类型,因此我们需要使用运行时反射(runtime reflection)。

use std::fmt::Debug;
use std::any::Any;// 对任何实现了Debug的类型进行Logger打印
fn log<T: Any + Debug>(value: &T) {// 一个值 value 进行类型转换,并将其转换为 &dyn Any 类型的引用。// 这种转换允许将一个具体类型的值视为实现了 Any trait 的类型,// 并且可以在运行时进行类型检查和转换// // 【value_any视为一个实现了 Any trait 的类型】let value_any = value as &dyn Any;// 【将动态类型转换为具体类型】// downcast_ref 方法来尝试将 &dyn Any 引用转换为 String 类型的引用// 它会返回一个 Option,以便在转换失败时处理错误情况match value_any.downcast_ref::<String>() {Some(as_string) => {println!("String ({}): {}", as_string.len(), as_string)

相关文章:

rust学习-any中的downcast和downcast_ref

背景 看rust官方文档,好奇Any和Go的Any是否是一回事,看到下文的一行代码,了解下它的功能 pub trait Any: static {// Required methodfn type_id(&self) -> TypeId; }std::any 用于 dynamic typing 或者 type reflection 模拟动态类型的trait。 大多数类型都实现 …...

js检测数据类型总结

目录 一、typeof 二、instanceof 三、constructor 四、Object.prototype.toString.call() Object.prototype.toString.call(obj)类型检测原理 五、__proto__ 六、 其他 一、typeof typeof在对值类型number、string、boolean 、symbol、 undefined、 function的反应是精准…...

获奖作品展示 | 2023嵌入式大赛AidLux系列作品精彩纷呈

第六届&#xff08;2023&#xff09;全国大学生嵌入式芯片与系统设计竞赛应用赛道全国总决赛已于8月下旬圆满结束。 本届赛事中&#xff0c;AidLux是广和通5G智能物联网赛题的唯一软件支持&#xff0c;阿加犀为该赛题学生们提供了全程线上辅导、技术答疑&#xff0c;以及大赛专…...

Mybatis 二级缓存(使用Redis作为二级缓存)

上一篇我们介绍了mybatis中二级缓存的使用&#xff0c;本篇我们在此基础上介绍Mybatis中如何使用Redis作为二级缓存。 如果您对mybatis中二级缓存的使用不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 二级缓存https://blog.csd…...

VMware vSphere ESXI 6.7 U3封装RTL8125B网卡驱动

之前的教程VMware vSphere ESXI 6.7 U3最新版本封装网卡驱动补丁可参考&#xff0c;本文为此文章的又一次实践 准备工作 1、ESXi-Customizer-PS-v2.6.0.ps1 &#xff08;官网下载&#xff0c;Github下载&#xff09; 2、ESXi670-202210001.zip &#xff08;VMware vSphere Hy…...

黑马JVM总结(二十五)

&#xff08;1&#xff09;字节码指令-cinit 构造方法可以分为两类&#xff0c;一类是cinit 一类init cinit是整个类的构造方法 putstatic&#xff1a;进行static变量的赋值&#xff0c;是到常量池里找到名字一个叫做i的变量 &#xff08;2&#xff09;字节码指令-init in…...

基础数据结构之——【顺序表】(上)

从今天开始更新数据结构的相关内容。&#xff08;我更新博文的顺序一般是按照我当前的学习进度来安排&#xff0c;学到什么就更新什么&#xff08;简单来说就是我的学习笔记&#xff09;&#xff0c;所以不会对一个专栏一下子更新到底&#xff0c;哈哈哈哈哈哈哈&#xff01;&a…...

Apollo自动驾驶系统概述(文末参与活动赠送百度周边)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

Java 21 新特性:Unnamed Classes and Instance Main Methods

Java 21引入了两个语言核心功能&#xff1a; 未命名的Java类你说新的启动协议&#xff1a;该协议允许更简单地运行Java类&#xff0c;并且无需太多样板 下面一起来看个例子。通常&#xff0c;我们初学Java的时候&#xff0c;都会写类似下面这样的 Hello World 程序&#xff1…...

Tomcat启动后的日志输出为乱码

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

CSP-J第二轮试题-2021年-4题

文章目录 参考&#xff1a;总结 [CSP-J 2021] 小熊的果篮题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示答案答案1答案2答案3 现场真题注意事项 参考&#xff1a; https://www.luogu.com.cn/probl…...

10.1 今日任务:select实现服务器并发

#include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.112.115" //本机IP&#xff0c;ifco…...

P1540 [NOIP2010 提高组] 机器翻译(模拟)

[NOIP2010 提高组] 机器翻译 题目背景 小晨的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 题目描述 这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#xf…...

生信教程:ABBA-BABA分析之滑动窗口

简介 ABBA BABA 统计&#xff08;也称为 D 统计&#xff09;为偏离严格的分叉进化历史提供了简单而有力的检验。因此&#xff0c;它们经常用于使用基因组规模的 SNP 数据测试基因渗入。 虽然最初开发用于基因渗入的全基因组测试&#xff0c;但它们也可以应用于较小的窗口&#…...

二分答案(求最大值的最小值||求最小值的最大值)

引入 二分答案要建立在二分查找的基础上&#xff0c;在此之前&#xff0c;要知道二分查找的三个模板 模板一 while(l<r) {int mid(lr)>>1;if(check(mid)) rmid;else lmid1; }模板二 while(l<r) {int midlr1>>1;if(check(mid)) lmid;else rmid-1; }模板三…...

思维模型 周期

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。周期是一个看似极为简单&#xff0c;但背后却蕴藏着大智慧的模型&#xff0c;了解周期&#xff0c;对于了解王朝更替&#xff0c;数学之美&#xff0c;经济运转等都有帮助。 1 周期的应用 …...

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 介绍项目/ 需求分析

文章目录 一、消息队列是什么&#xff1f;二、需求分析结构解析功能解析规则解析绑定关系交换机类型消息应答 三、持久化存储四、网络通信提供的API复用TCP连接 五、消息队列概念图 一、消息队列是什么&#xff1f; 消息队列 (Message Queue, MQ)就是将阻塞队列这一数据结构提取…...

Python学习之索引与切片

Python学习之索引与切片 s “0abcdefghijklmnopqrstuvwxyz”&#xff0c;第一个元素‘0’&#xff0c;索引号为0&#xff0c;最后一个元素‘z’&#xff0c;索引号为26 1. s[0]获取索引号为0的元素 2. s[1:3]获取索引号为1的元素&#xff0c;直到但不包括索引号为3的元素。即…...

编程每日一练(多语言实现)基础篇:满足abcd=(ab+cd)^2的数 (增加Go语言实现)

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现3.5 Go 语言实现 一、实例描述 假设 abcd 是一个四位整数&#xff0c;将它分成两段&#xff0c;即 ab 和 cd&#xff0c;使之相加求和后再平方。求满…...

LeetCode 热题 HOT 100:回溯专题

LeetCode 热题 HOT 100&#xff1a;https://leetcode.cn/problem-list/2cktkvj/ 文章目录 17. 电话号码的字母组合22. 括号生成39. 组合总和46. 全排列补充&#xff1a;47. 全排列 II &#xff08;待优化)78. 子集79. 单词搜索124. 二叉树中的最大路径和200. 岛屿数量437. 路径…...

Storj监控与告警配置:如何实时掌握存储网络状态

Storj监控与告警配置&#xff1a;如何实时掌握存储网络状态 【免费下载链接】storj Ongoing Storj v3 development. Decentralized cloud object storage that is affordable, easy to use, private, and secure. 项目地址: https://gitcode.com/gh_mirrors/st/storj St…...

5分钟快速部署:docker-elk实时数据处理架构完整指南 [特殊字符]

5分钟快速部署&#xff1a;docker-elk实时数据处理架构完整指南 &#x1f680; 【免费下载链接】docker-elk deviantony/docker-elk: 是一个使用 Docker 部署的 ELK Stack&#xff08;Elasticsearch、Logstash 和 Kibana&#xff09;解决方案&#xff0c;提供了预先构建的 Dock…...

数据科学家的懒人包:OpenClaw+nanobot自动清洗CSV并生成可视化报告

数据科学家的懒人包&#xff1a;OpenClawnanobot自动清洗CSV并生成可视化报告 1. 为什么需要自动化数据清洗与报告生成&#xff1f; 作为一名经常处理数据的人&#xff0c;我发现自己每周都在重复同样的工作&#xff1a;收到CSV文件→检查格式→处理缺失值→生成可视化→发送…...

国内免费AI编程工具推荐

DeepSeek Code 由深度求索公司开发&#xff0c;支持代码生成、补全和错误检测&#xff0c;涵盖Python、Java等多种语言&#xff0c;提供网页版和插件形式。CodeGeeX 清华大学团队推出的多语言代码生成工具&#xff0c;支持VS Code等IDE插件&#xff0c;具备代码翻译和解释功能。…...

Wan2.2-I2V-A14B极限测试:挑战生成复杂网络拓扑结构的动态演化视频

Wan2.2-I2V-A14B极限测试&#xff1a;挑战生成复杂网络拓扑结构的动态演化视频 1. 开场白&#xff1a;当AI遇见网络拓扑 最近在测试Wan2.2-I2V-A14B模型时&#xff0c;我突发奇想&#xff1a;这个号称能理解复杂概念的文生视频模型&#xff0c;能否准确呈现网络拓扑结构的动态…...

墨语灵犀Python入门辅助:从零开始学编程的智能导师

墨语灵犀Python入门辅助&#xff1a;从零开始学编程的智能导师 想学Python&#xff0c;但一打开教程就被满屏的术语和代码吓退了&#xff1f;自己写代码&#xff0c;遇到报错看不懂&#xff0c;搜了半天也找不到答案&#xff0c;是不是很挫败&#xff1f;别担心&#xff0c;这…...

Apple Cursor:重新定义跨平台指针体验的开源解决方案

Apple Cursor&#xff1a;重新定义跨平台指针体验的开源解决方案 【免费下载链接】apple_cursor Free & Open source macOS Cursors. 项目地址: https://gitcode.com/gh_mirrors/ap/apple_cursor 问题溯源&#xff1a;被忽视的交互基石 在数字交互的世界里&#xf…...

像素时装锻造坊实战:用AI快速生成电商服装像素海报,效果惊艳

像素时装锻造坊实战&#xff1a;用AI快速生成电商服装像素海报&#xff0c;效果惊艳 1. 电商视觉设计的效率革命 每天清晨&#xff0c;电商设计师小张都要面对同样的挑战&#xff1a;为30款新上架的皮衣制作主图海报。传统流程需要拍摄实物、修图调色、设计排版&#xff0c;平…...

Source Han Serif CN:终极开源中文字体深度技术指南

Source Han Serif CN&#xff1a;终极开源中文字体深度技术指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf Source Han Serif CN&#xff08;思源宋体&#xff09;是Google与Adobe…...

ANIMATEDIFF PRO性能对比:Ubuntu与Windows系统基准测试

ANIMATEDIFF PRO性能对比&#xff1a;Ubuntu与Windows系统基准测试 同样的硬件&#xff0c;不同的系统&#xff0c;AI视频生成性能究竟有多大差异&#xff1f; 作为一名长期从事AI视频生成的技术从业者&#xff0c;我经常被问到一个问题&#xff1a;在Ubuntu和Windows系统上运行…...