rust实战 - newtype模式
什么是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模式的更多相关文章
- Rust实战系列-基本语法
本文是<Rust in action>学习总结系列的第二部分,更多内容请看已发布文章: 一.Rust实战系列-Rust介绍 " 主要介绍 Rust 的语法.基本类型和数据结构,通 ...
- 重学 Java 设计模式:实战桥接模式(多支付渠道「微信、支付宝」与多支付模式「刷脸、指纹」场景)
作者:小傅哥 博客:https://bugstack.cn - 编写系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么你的代码那么多ifelse 同类的业务.同样的功能, ...
- 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...
- 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...
- 重学 Java 设计模式:实战迭代器模式「模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相信相信的力量! 从懵懂的少年,到拿起键盘,可以写一个Hell ...
- 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...
- 重学 Java 设计模式:实战状态模式「模拟系统营销活动,状态流程审核发布上线场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! @ 目录 一.前言 二.开发环境 三.状态模式介绍 四.案例场景模拟 1 ...
- 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 能力,是你前行的最大保障 年龄会不断的增长,但是什么才能让你不 ...
- Jmeter之http性能测试实战 NON-GUI模式 进行分布式压力测试——干货(十二)
Apache JMeter Distributed Testing Step-by-step This short tutorial explains how to use multiple syst ...
- csredis-in-asp.net core理论实战-哨兵模式-使用示例
csredis 开源地址 https://github.com/2881099/csredis 续上篇 csredis-in-asp.net core理论实战-主从配置.哨兵模式 示例源码 https ...
随机推荐
- List接口和Deque接口的ArrayList和Vetor,LinkedList及ArrayDeque等实现类
ArrayList和Vetor是List两个典型的实现类. 他们都是基于数组的实现类.内部都封装了一个动态的,允许再分配的Object[]数组. 他两方法基本都相同.除了,ArrayList是线程不安 ...
- java基础之变量,常量,作用域
/*注意点:在实际开发的过程中要注意变量命名规范*/ 变量 public class Demo8 { //属性:变量 static String zx="钟县"; ...
- nsw与mock 模拟分页接口
安装依赖 项目中使用到一下依赖,请提前安装 npm install msw lodash axios 开启mock 定义mock,创建 src/mock/index.ts import _ from ...
- CPU的几核几线程是什么意思?
前言 经常看到 电脑硬件的配置参数上 是这么标注cpu的 是不是不太明白 是什么意思? 命名 每个cpu型号都有自己名字,比如上边举例的那款叫做 i5-12600k i5指得是 英特尔公司把自家cpu ...
- Kamailio 5.8.3与rtpengine双网卡SBC集成要点
本文档总结了将Kamailio 5.8.3与rtpengine(配置为双网卡模式)集成以实现SIP+RTP媒体流转发(包括音视频和RTCP)的关键配置要点和最佳实践.用户场景包括:无NAT.公私网双向 ...
- 开发工具系列003-OSX系统基础命令
本文简单记录工作中常用的命令行(持续更新),因为我用的是`Mac OSX`系统,因此部分命令在`Windows系统`中将失效(或需调整),此外需注意Windows的文件系统路径斜杠和`UNIX`是反的 ...
- ETL数据集成丨MySQL到MySQL的数据迁移实践
前言 MySQL数据迁移至另一MySQL数据库的过程,不仅是数据复制或移动的操作那么简单,它还涉及到一系列策略性考量和技术优化,旨在实现数据的高效.安全传输,以及确保目标系统的高性能运行.其深远意义在 ...
- 监控Streamlit中每段代码的rerun情况
把代码放到不同的函数中并用下面的装饰器包裹即可在log中输出rerun次数. 依赖: loguru import streamlit as st from functools import wraps ...
- POLIR-Laws: 报案、举报、控告有什么区别?
报案.举报.控告有什么区别呢? 我这里说的报案.举报.控告指的是刑事诉讼法中的概念, 其他的可以参照适用,比如<治安管理处罚法>中也有报案.举报.控告的概念. <刑事诉讼法>第 ...
- 标准结构篇:8.3)PDF数字签名的制作与运用
本章目的:学会制作PDF数字签名,了解运用场合. 1.pdf数字签名展示 2.pdf数字签名的作用 ①可以签各种大小不同的名字 这一点在标准作图很有用,因为图纸图框和标题栏的大小是有国标规定的,不能随 ...