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

对rust中的from和into的理解

两个重要的特征(trait),它们为类型之间的转换提供了强大而灵活的机制

From 特征

From 特征用于定义一个类型如何从另一个类型转换而来

pub trait From<T> {
    fn from(T) -> Self;
}

T 是源类型,也就是要转换的类型
Self 是目标类型,即转换后的类型
当一个类型实现了 From<T> 特征时,就意味着该类型可以从 T 类型转换得到

Into 特征

Into 特征用于定义一个类型可以转换为另一个类型

pub trait Into<T> {
    fn into(self) -> T;
}

T 是目标类型
self 是源类型的实例,通过调用 into() 方法将自身转换为目标类型 T

两者关系

在 Rust 中,如果一个类型实现了 From<T> 特征,那么 Rust 会自动为其实现 Into<T> 特征
这是因为 Into 特征的实现可以基于 From 特征的实现

#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let num = Number::from(30);
    let num2: Number = 30.into();
    println!("{:?}, {:?}", num, num2);
}

Number 类型实现了 From<i32> 特征,因此可以使用 Number::from(30) 进行转换,同时也可以使用 30.into() 进行转换,因为 Rust 自动为 Number 实现了 Into<Number> 特征

使用场景

From 特征
当希望一个类型能够从另一个类型方便地创建时,使用 From 特征。例如,将 &str 转换为 String

let s: String = String::from("hello");

Into 特征
当有一个值,想要将其转换为另一个类型时,使用 Into 特征:

fn takes_string(s: String) {
    println!("Received: {}", s);
}

let s = "hello";
takes_string(s.into());

快速记忆技巧

From:来源导向:
可以把 From 理解为 “从哪里来”,即目标类型是从源类型转换而来的。就像 String::from("hello") 表示字符串是从 &str 类型转换得到的。想象成一个箭头,从源类型指向目标类型,数据的流动方向是从源到目标。

Into:目标导向:
Into 可以理解为 “进入到哪里去”,即源类型的值要进入到目标类型中。例如 s.into() 表示 s 要转换为另一个类型。把它想象成一个容器,源类型的值要进入到目标类型这个容器中。

通过记住 “From 是从哪来,Into 是到哪去”,可以快速区分和理解这两个特征的用途
同时,要记住它们之间的自动实现关系,实现了 From 就自动拥有了 Into 的能力

相关文章:

  • RA-Eco-RA2L1-48PIN-V1.0开发板RTC时钟
  • redis restore 命令的用法
  • 【深度学习】强化学习(RL)-A3C(Asynchronous Advantage Actor-Critic)
  • 快速使用通义千问大模型API + VUE
  • 【时序预测】深度时序预测算法的对比与核心创新点分析
  • ArcGIS Pro中打造精美高程渲染图的全面指南
  • 数据开发面试:DQL,DDL,DTL
  • 【Kubernetes】对资源进行PATCH
  • 【Mysql】:数据库表的三部曲(数据操作 + 类型解析 + 约束规则)
  • sqlmap:自动SQL注入和数据库接管工具
  • JSX基础 —— 识别JS表达式
  • 【鸿蒙Next】系统通知权限申请
  • apk反编译工具
  • html2canvas 实现屏幕截图、生成海报功能
  • C++ 常见面试知识点
  • 为什么java从json中获取值有数据类型,而从xml中获取值没有数据类型?
  • 一个典型的要求: Python | C#实现年月日创建文件夹 时分秒对应文件名的保存路径
  • 基于springboot学生管理系统
  • SpringBoot接口自动化测试实战:从OpenAPI到压力测试全解析
  • 被AWS反撸了,试一下能否申请退还
  • 怎么更改网站首页图片尺寸/站长工具seo综合查询降级
  • wordpress主体首页空/天津seo实战培训
  • 网页制作与设计项目策划书/微博seo排名优化
  • 合肥工程建设网站/2022小说排行榜百度风云榜
  • 网络及建设公司网站/百度外链查询工具
  • 深圳龙岗网络科技有限公司/如何提高网站排名seo