前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rust 标准库 std::mem 的一个细节

rust 标准库 std::mem 的一个细节

作者头像
charmer
发布2024-05-15 21:01:33
500
发布2024-05-15 21:01:33
举报
文章被收录于专栏:编程大主教编程大主教

在 rust 标准库 std::mem 中有三个变量“替换”的函数:

std::mem::take:将变量 dest 替换为其类型的默认值,并返回原来的 dest

代码语言:javascript
复制
pub fn take<T>(dest: &mut T) -> T
where
    T: Default,

std::mem::replace:将 src 移动到 dest,并返回原来的 dest

代码语言:javascript
复制
pub fn replace<T>(dest: &mut T, src: T) -> T

std::mem::swap:交换两个可变变量的值

代码语言:javascript
复制
pub fn swap<T>(x: &mut T, y: &mut T)

需要注意的是,所有的值交换都是 浅拷贝,也就是说如果两个变量内含堆(heap)上的内容,堆内容不会交换,而是交换堆地址的引用。

例子一:take

rust palyground

代码语言:javascript
复制
use std::mem;

fn main() {
    let mut hello = vec![1, 2, 3];

    println!("hello ({:?}) address: {:p}, internal buffer address: {:p}", hello, &hello, &*hello);
    let old_hello = mem::take(&mut hello);
    println!("hello ({:?}) address: {:p}, internal buffer address: {:p}; old_hello ({:?}) address: {:p}, internal buffer address: {:p}", hello, &hello, &*hello, old_hello, &old_hello, &*old_hello);
}

结果如下:

代码语言:javascript
复制
hello ([1, 2, 3]) address: 0x7ffd7257abe8, internal buffer address: 0x5639f36959d0
hello ([]) address: 0x7ffd7257abe8, internal buffer address: 0x4; old_hello ([1, 2, 3]) address: 0x7ffd7257ac78, internal buffer address: 0x5639f36959d0

例子二:replace

rust playground

代码语言:javascript
复制
use std::mem;

fn main() {
    let mut hello = vec![1, 2, 3];

    println!("hello ({:?}) address: {:p}, internal buffer address: {:p}", hello, &hello, &*hello);
    let old_hello = mem::replace(&mut hello, vec![4, 5, 6]);
    println!("hello ({:?}) address: {:p}, internal buffer address: {:p}; old_hello ({:?}) address: {:p}, internal buffer address: {:p}", hello, &hello, &*hello, old_hello, &old_hello, &*old_hello);
}

结果如下:

代码语言:javascript
复制
hello ([1, 2, 3]) address: 0x7ffc309a86f0, internal buffer address: 0x560fea5ee9d0
hello ([4, 5, 6]) address: 0x7ffc309a86f0, internal buffer address: 0x560fea5ee9f0; old_hello ([1, 2, 3]) address: 0x7ffc309a8780, internal buffer address: 0x560fea5ee9d0

例子三:swap

rust playground

代码语言:javascript
复制
use std::mem;

fn main() {
    let mut hello1 = vec![1, 2, 3];

    let mut hello2 = vec![4, 5, 6];

    println!("hello1 ({:?}) address: {:p}, internal buffer address: {:p}; hello2 ({:?}) address: {:p}, internal buffer address: {:p}", hello1, &hello1, &*hello1, hello2, &hello2, &*hello2);
    mem::swap(&mut hello1, &mut hello2);
    println!("hello1 ({:?}) address: {:p}, internal buffer address: {:p}; hello2 ({:?}) address: {:p}, internal buffer address: {:p}", hello1, &hello1, &*hello1, hello2, &hello2, &*hello2);
}

结果如下:

代码语言:javascript
复制
hello1 ([1, 2, 3]) address: 0x7fff773fa2b0, internal buffer address: 0x5618b26639d0; hello2 ([4, 5, 6]) address: 0x7fff773fa2c8, internal buffer address: 0x5618b26639f0
hello1 ([4, 5, 6]) address: 0x7fff773fa2b0, internal buffer address: 0x5618b26639f0; hello2 ([1, 2, 3]) address: 0x7fff773fa2c8, internal buffer address: 0x5618b26639d0
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 例子一:take
  • 例子二:replace
  • 例子三:swap
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档