什么是newtype

简单的说,就是用元组结构体将已有类型包裹起来:struct Meters(u32)

newtype的优点:

  • 自定义类型可以让我们给出更有意义和可读性的类型名,比如struct Year(u32)
  • 某些场景,只有newtype可以很好的解决
  • 隐藏内部类型的细节

自定义类型给出更有意义的命名

struct Years(i64);

struct Days(i64);

impl Years {
pub fn to_days(&self) -> Days {
Days(self.0 * 365)
}
} impl Days {
/// truncates partial years
pub fn to_years(&self) -> Years {
Years(self.0 / 365)
}
}

在外部类型上实现外部trait

rust限定只有当类型和对应trait中的任意一个定义在本地包内时,才能够为该类型实现trait,叫做孤儿规则

比如你不能Vec实现fmt::Display。

通过newtype类型可以绕过孤儿规则,实现是利用元组结构体创建出新的类型。并且不会造成任何运行时开销,新类型会在编译过程中被优化掉。

use std::{fmt, ops::Deref};

struct Wrapper(Vec<String>);

impl fmt::Display for Wrapper {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "[{}]", self.0.join(", "))
}
} impl Deref for Wrapper {
type Target = Vec<String>; fn deref(&self) -> &Self::Target {
&self.0
}
} fn main() {
let w = Wrapper(vec![String::from("hello"),
String::from("world")]);
println!("w = {}", w);
println!("wrapper can use vec function join, join result is: {}", w.join(","));
}

因为Wrapper是一个新的类型,所以它没有自己内部值的方法。为了让Wrapper的行为与Vec完全一致,我们需要在Wrapper中实现所有Vec的方法,并将这些方法委托给self.0。假如我们希望新类型具有内部类型的所有方法,那么我们也可以为Wrapper实现Deref trait来直接返回内部的类型。假如我们不希望Wrapper类型具有内部类型的所有方法,比如在需要限制Wrapper类型的行为时,我们就只能手动实现需要的那部分方法了。

封装内部细节

#[derive(Debug)]
struct WrapperStr(String); fn main() {
let s = "Hello World".to_string();
let mut w = WrapperStr(s);
println!("{:?}", w); // 隐藏了被包装String的方法
// 但仍然可以通过下面方式调用
// w.0.push_str(" !");
// println!("{:?}", w);
}

rust实战 - newtype模式的更多相关文章

  1. Rust实战系列-基本语法

    本文是<Rust in action>学习总结系列的第二部分,更多内容请看已发布文章: 一.Rust实战系列-Rust介绍 " 主要介绍 Rust 的语法.基本类型和数据结构,通 ...

  2. 重学 Java 设计模式:实战桥接模式(多支付渠道「微信、支付宝」与多支付模式「刷脸、指纹」场景)

    作者:小傅哥 博客:https://bugstack.cn - 编写系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么你的代码那么多ifelse 同类的业务.同样的功能, ...

  3. 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...

  4. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...

  5. 重学 Java 设计模式:实战迭代器模式「模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相信相信的力量! 从懵懂的少年,到拿起键盘,可以写一个Hell ...

  6. 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...

  7. 重学 Java 设计模式:实战状态模式「模拟系统营销活动,状态流程审核发布上线场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! @ 目录 一.前言 二.开发环境 三.状态模式介绍 四.案例场景模拟 1 ...

  8. 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 能力,是你前行的最大保障 年龄会不断的增长,但是什么才能让你不 ...

  9. Jmeter之http性能测试实战 NON-GUI模式 进行分布式压力测试——干货(十二)

    Apache JMeter Distributed Testing Step-by-step This short tutorial explains how to use multiple syst ...

  10. csredis-in-asp.net core理论实战-哨兵模式-使用示例

    csredis 开源地址 https://github.com/2881099/csredis 续上篇 csredis-in-asp.net core理论实战-主从配置.哨兵模式 示例源码 https ...

随机推荐

  1. 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(13)

    1.问题描述: 推送通知里的skills标签有什么用?不填写似乎不影响推送,以及推送的点击跳转操作 解决方案: 鸿蒙系统的推送通知中的skills标签主要用于指定接收推送的应用程序所支持的能力(Ski ...

  2. Django实战:HTTP状态码与业务状态码的分层设计与实战应用

    一.HTTP 状态码 介绍 HTTP响应状态码是用以表示网页服务器HTTP响应状态的3位数字代码.它由HTTP协议定义,用于描述请求 - 响应过程中的各种状态,帮助客户端(如浏览器)理解服务器的响应结 ...

  3. java基础——函数、数组、排序

    函数的重载 函数的重载:在一个类中出现两个或者两个以上的同名函数,这个称作为函数的重载. 函数重载的作用: 同一个函数名可以出现了不同的函数,以应对不同个数或者不同数据类型的参数. 函数重载的要求: ...

  4. Luogu P11131 【MX-X5-T3】「GFOI Round 1」Cthugha 题解

    P11131 [MX-X5-T3]「GFOI Round 1」Cthugha 有意思的最短路题目,需要对迪杰斯特拉算法有深入的理解. 首先,不存在最小值的条件是相邻的两个格子加起来值小于 \(0\), ...

  5. opengl 学习 之 10 lesson

    opengl 学习 之 10 lesson 简介 透明度 简单来说让设定的透明度起作用. link http://www.opengl-tutorial.org/uncategorized/2017/ ...

  6. 结构化网格 & 非结构化网格

    简介 简单的名词释义 参考文献 基于迭代的六面体网格生成算法 结构化网格 又称为栅格,是指区域内所有的网格点都有相同的度.结构化网格的优点有生成速度快,存储结构简单,有许多优化措施,对形状简单的物体, ...

  7. SciTech-Management-Organizing:组织-RMM(Role Management Model):角色管理模型 的 民主共和 VS 层级结构明确的ARCI(责任分配矩阵)法则

    Organizing:组织-RMM(Role Management Model):角色管理模型 根据"人群"与"社会"的"民主"和" ...

  8. SciTech-BigDataAIML-Algorithm: 主观经验:先验概率&似然概率 和 客观事实:后验概率&条件概率 + Floyd(弗落伊得)最短路线算法

    主观经验 和 客观事实:后验概率 Subjective主观经验: 先验概率 & 似然概率 Objective客观事实: 后验概率 & 条件概率 Floyd(弗落伊得)最短路线算法

  9. 进阶篇:3.3.3)DFM砂型铸造件设计

    本章目的:设计出的零件符合砂型铸造工艺.   1.概念: 砂型铸造是一种将融化的金属注入到砂型模具的工艺,当金属凝固后可以从砂型中取出铸件.   2.砂型铸造的设计准则: 1.避免多角和多截面链接: ...

  10. 2023年8月最新全国省市区县和乡镇街道行政区划矢量边界坐标经纬度地图数据 shp geojson json

    发现个可以免费下载全国 geojson 数据的网站,推荐一下.支持全国.省级.市级.区/县级.街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3.Echarts等 geojso ...