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系列作品精彩纷呈
第六届(2023)全国大学生嵌入式芯片与系统设计竞赛应用赛道全国总决赛已于8月下旬圆满结束。 本届赛事中,AidLux是广和通5G智能物联网赛题的唯一软件支持,阿加犀为该赛题学生们提供了全程线上辅导、技术答疑,以及大赛专…...
Mybatis 二级缓存(使用Redis作为二级缓存)
上一篇我们介绍了mybatis中二级缓存的使用,本篇我们在此基础上介绍Mybatis中如何使用Redis作为二级缓存。 如果您对mybatis中二级缓存的使用不太了解,建议您先进行了解后再阅读本篇,可以参考: Mybatis 二级缓存https://blog.csd…...
VMware vSphere ESXI 6.7 U3封装RTL8125B网卡驱动
之前的教程VMware vSphere ESXI 6.7 U3最新版本封装网卡驱动补丁可参考,本文为此文章的又一次实践 准备工作 1、ESXi-Customizer-PS-v2.6.0.ps1 (官网下载,Github下载) 2、ESXi670-202210001.zip (VMware vSphere Hy…...
黑马JVM总结(二十五)
(1)字节码指令-cinit 构造方法可以分为两类,一类是cinit 一类init cinit是整个类的构造方法 putstatic:进行static变量的赋值,是到常量池里找到名字一个叫做i的变量 (2)字节码指令-init in…...
基础数据结构之——【顺序表】(上)
从今天开始更新数据结构的相关内容。(我更新博文的顺序一般是按照我当前的学习进度来安排,学到什么就更新什么(简单来说就是我的学习笔记),所以不会对一个专栏一下子更新到底,哈哈哈哈哈哈哈!&a…...
Apollo自动驾驶系统概述(文末参与活动赠送百度周边)
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄ÿ…...
Java 21 新特性:Unnamed Classes and Instance Main Methods
Java 21引入了两个语言核心功能: 未命名的Java类你说新的启动协议:该协议允许更简单地运行Java类,并且无需太多样板 下面一起来看个例子。通常,我们初学Java的时候,都会写类似下面这样的 Hello World 程序࿱…...
Tomcat启动后的日志输出为乱码
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
CSP-J第二轮试题-2021年-4题
文章目录 参考:总结 [CSP-J 2021] 小熊的果篮题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示答案答案1答案2答案3 现场真题注意事项 参考: 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 //端口号,范围1024~49151 #define IP "192.168.112.115" //本机IP,ifco…...
P1540 [NOIP2010 提高组] 机器翻译(模拟)
[NOIP2010 提高组] 机器翻译 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词…...
生信教程:ABBA-BABA分析之滑动窗口
简介 ABBA BABA 统计(也称为 D 统计)为偏离严格的分叉进化历史提供了简单而有力的检验。因此,它们经常用于使用基因组规模的 SNP 数据测试基因渗入。 虽然最初开发用于基因渗入的全基因组测试,但它们也可以应用于较小的窗口&#…...
二分答案(求最大值的最小值||求最小值的最大值)
引入 二分答案要建立在二分查找的基础上,在此之前,要知道二分查找的三个模板 模板一 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; }模板三…...
思维模型 周期
本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。周期是一个看似极为简单,但背后却蕴藏着大智慧的模型,了解周期,对于了解王朝更替,数学之美,经济运转等都有帮助。 1 周期的应用 …...
从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 介绍项目/ 需求分析
文章目录 一、消息队列是什么?二、需求分析结构解析功能解析规则解析绑定关系交换机类型消息应答 三、持久化存储四、网络通信提供的API复用TCP连接 五、消息队列概念图 一、消息队列是什么? 消息队列 (Message Queue, MQ)就是将阻塞队列这一数据结构提取…...
Python学习之索引与切片
Python学习之索引与切片 s “0abcdefghijklmnopqrstuvwxyz”,第一个元素‘0’,索引号为0,最后一个元素‘z’,索引号为26 1. s[0]获取索引号为0的元素 2. s[1:3]获取索引号为1的元素,直到但不包括索引号为3的元素。即…...
编程每日一练(多语言实现)基础篇:满足abcd=(ab+cd)^2的数 (增加Go语言实现)
文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现3.5 Go 语言实现 一、实例描述 假设 abcd 是一个四位整数,将它分成两段,即 ab 和 cd,使之相加求和后再平方。求满…...
LeetCode 热题 HOT 100:回溯专题
LeetCode 热题 HOT 100:https://leetcode.cn/problem-list/2cktkvj/ 文章目录 17. 电话号码的字母组合22. 括号生成39. 组合总和46. 全排列补充:47. 全排列 II (待优化)78. 子集79. 单词搜索124. 二叉树中的最大路径和200. 岛屿数量437. 路径…...
98的堂邀请码色花的堂邀请码
兑换不易,可以联系邮箱sht98sht163.com,出邀请。...
深夜连上服务器,我再也不想敲命令行
前言 那是晚上十一点,我第五次输错IPtables规则,服务器直接失联了。赶紧给机房打电话,求助工程师帮忙重启。电话里听着对方说"下次小心点",我只能苦笑——命令行这东西,真不是熬夜能hold住的。 就在这时&a…...
Midjourney中画幅风格不生效?5个致命配置错误正在 silently 毁掉你的成片率
更多请点击: https://kaifayun.com 第一章:Midjourney中画幅风格失效的真相与底层机制 Midjourney 中的中画幅(Medium Format)风格常被用户以 --style medium-format 或关键词 medium format film 调用,但大量实测表…...
5个核心技术:深度掌握Sollumz在GTA V建模中的架构设计与实战应用
5个核心技术:深度掌握Sollumz在GTA V建模中的架构设计与实战应用 【免费下载链接】Sollumz Grand Theft Auto V modding suite for Blender. This add-on allows the creation of modded game assets: 3D models, maps, interiors, animations, etc. 项目地址: ht…...
pubnub代码示例
import time from pubnub.pnconfiguration import PNConfiguration from pubnub.pubnub import PubNub, SubscribeListener from pubnub.exceptions import PubNubExceptionpublish_key=pub-c-fab-b05a-c355bb3adac5 subscribe_key=sub...
YimMenu:GTA5游戏增强工具从入门到精通完全指南
YimMenu:GTA5游戏增强工具从入门到精通完全指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...
2026有赞春季发布会:有效果的AI驱动增长,智能体和数字员工交出成绩单
5月21日,有赞2026年春季发布会在杭州举办,主题是“有效果的AI”。过去一年,有赞智能体和数字员工已经迈入交付结果的新阶段。数据显示,2025年有赞AI智能体活跃使用商家18220个,整体调用量超3600万次,引导成…...
Claude Code 用户如何配置 Taotoken 解决密钥与额度困扰
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Claude Code 用户如何配置 Taotoken 解决密钥与额度困扰 对于依赖 Claude Code 进行编程辅助的开发者而言,直接管理多个…...
国内大学生必备的AI论文写作工具有哪些?
国内高校学生常用的 AI 论文写作工具,以本土化全流程工具为主,结合通用大模型与专业辅助功能,覆盖选题、框架搭建、初稿撰写、查重降重、格式调整等关键环节,以下是主流工具详解与对比:一、本土全流程论文 AI 工具&…...
如何快速掌握TegraRcmGUI:Windows上最简单的Switch注入工具终极指南
如何快速掌握TegraRcmGUI:Windows上最简单的Switch注入工具终极指南 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI 想要在Nintendo Switch上体验…...
