首页 > 其他分享 >rust 使用 take 和 replace 来保留所有值

rust 使用 take 和 replace 来保留所有值

时间:2023-11-04 14:44:49浏览次数:26  
标签:mut name mem MyEnum take replace rust String

使用 take 和 replace 来保留所有值

枚举类型

enum MyEnum {
    A { name: String, x: u32 },
    B { name: String },
}

使用 std::mem::take()std::mem::replace() 在不克隆 name 的情况下修改 name

这种方式可以不用 #[derive(Clone)],不存在内存分配。

#![allow(unused)]
use std::mem;

#[derive(Debug, Clone)]
enum MyEnum {
    A { name: String, x: u32 },
    B { name: String },
}

fn convert_a_to_b(x: &mut MyEnum) {
    // if let MyEnum::A { name, x: 0 } = x {
    //     *x = MyEnum::B {
    //         name: mem::take(name),
    //     }
    // }

    *x = match *x {
        MyEnum::A { ref mut name, x: 0 } => MyEnum::B {
            name: mem::take(name),
        },
        _ => return,
    }
}
#[allow(clippy::mem_replace_with_default)]
fn convert_a_to_b2(x: &mut MyEnum) {
    if let MyEnum::A { name, x: 0 } = x {
        *x = MyEnum::B {
            name: mem::replace(name, String::new()),
        }
    }
}

/// 假设我们有一个至少有两种变体的枚举&mut MyEnum 分别为
/// A { name: String, x: u8 }
/// B { name: String }
/// 现在我们想要当 `x = 0` 时,将A变为B,同时变量除变体类型变化外其他不变
#[test]
fn test() {
    let mut a = MyEnum::A {
        name: "A".to_owned(),
        x: 0,
    };
    println!("Before Convert, a is {:?}", a);

    convert_a_to_b(&mut a);
    println!("After Convert, a is {:?}", a);

    let mut a = MyEnum::A {
        name: "A".to_owned(),
        x: 0,
    };
    println!("Before Convert, a is {:?}", a);

    convert_a_to_b2(&mut a);
    println!("After Convert, a is {:?}", a);
}

标签:mut,name,mem,MyEnum,take,replace,rust,String
From: https://www.cnblogs.com/liuzonglin/p/17809313.html

相关文章

  • rust 使用借用类型作为参数
    使用借用类型作为参数编码时应该总是倾向于使用借用类型而不是借用所有类型。对于String类型来说,应该倾向于使用使用&str,而不是&String;#[allow(unused)]fnmain(){letstring:String="hello".to_string();letborrow_string:&String=&string;letborrow......
  • rust PBFT
    PBFT(PracticalByzantineFaultTolerance)PBFT(PracticalByzantineFaultTolerance)算法是一种分布式共识算法,旨在解决拜占庭将军问题(ByzantineGeneralsProblem)。拜占庭将军问题是指在分布式系统中,由于网络故障或者节点故障等原因,导致节点之间无法达成共识或者达成错误的共识。......
  • rust Unsurprising
    Unsurprising(不意外)最少意外原则接口应尽可能直观(可预测,用户能猜对)至少应该不让人感到惊奇核心思想贴近用户已经知道的东西(不必重学概念)让接口可测试命名实践实现常用的Traits人体工程学(Ergonomic)Traits包装类型(WrapperType)命名实践接口的名称,应符......
  • rust p2p
    p2p[+]Expanddescriptionp2p简介P2P:peer-to-peer(点对点)P2P是一种网络技术,可以在不同的计算机之间共享各种计算资源,如CPU、网络带宽和存储。P2P是当今用户在线共享文件(如音乐、图像和其他数字媒体)的一种非常常用的方法。Bittorrent和Gnutella是流行的文件共享p2p......
  • rust async
    asyncSend和Sync在跨线程时需要关注Send:ownership(所有权)可以send到其他线程AtypeisSendifitissafetosendittoanotherthread.Sync:可以并发,无线程安全问题AtypeisSyncifitissafetosharebetweenthreads(TisSyncifandonlyif&T......
  • Rust 结构体的方法描述
    Rust结构体的方法描述原文地址:https://rustwiki.org/zh-CN/rust-by-example/fn/methods.htmlRust的方法(method)是依附于对象的函数。这些方法通过关键字self来访问对象中的数据和其他。方法在impl代码块中定义。静态方法(staticmethod)静态方法不需要实例来调用,把结构体......
  • 信宇宙 TrustVerse:Web3.0数字资产管理
    在数字时代,个人和机构越来越依赖数字资产,这包括加密货币、数字证券、艺术品、不动产等各种价值存储形式。随着数字资产的重要性不断增加,安全性和管理变得至关重要。元信宇宙(TrustVerse)应运而生,旨在成为数字资产管理的未来,充分整合了Web3.0技术,智能生态网络(IEN)作为一种创新性的网络......
  • 22. 从零用Rust编写正反向代理,一个数据包的神奇HTTP历险记!
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmpro......
  • 通过tide库如何使用Rust语言采集汽车之家
    身边许多有车的朋友,在日常用车养车过程中,经常会碰到这样那样的问题,很多人都喜欢去汽车之家寻求帮助。那么今天,我将为大家带来的是使用tide库来编写的一个爬虫程序,并使用Rust语言来采集汽车之家的相关内容,不是特别难,有需要的朋友可以看看学习一下喔。```rustusetide::{Request,Re......
  • 安装rust
    https://blog.csdn.net/xiaojin21cen/article/details/129767672 使用rust语言碰到linker`link.exe`notfound|=note:programnotfoundnote:themsvctarge 运行rustuptoolchaininstallstable-x86_64-pc-windows-gnurustupdefaultstable-x86_64-pc-windows-g......