02. Rust 内存管理 Copy & Clone(上)

栏目: 编程语言 · Rust · 发布时间: 6年前

内容简介:Rust 语法上一个变量的值是转移给另一个变量, 但是有些情况下可能会想变量值转移之后, 自身还能继续使用. 可以使用我们现在了解到每次绑定变量, 都会发生所有权转移, 但是你会发现写有些东西的时候好像行为跟目前的认知有点不一样.

Rust 语法上一个变量的值是转移给另一个变量, 但是有些情况下可能会想变量值转移之后, 自身还能继续使用. 可以使用 clone 函数

let a = String::from("test");
let b = a.clone();
println!("{}", a);
复制代码

clone 这个函数是在标准库的 std::clone::Clone trait 里, 既然是个 trait, 也就意味着可以自己实现一套操作, 通常情况下用默认的定义就好了.

Copy

我们现在了解到每次绑定变量, 都会发生所有权转移, 但是你会发现写有些东西的时候好像行为跟目前的认知有点不一样.

let a: i32 = 10;
let b = a;
println!("a = {}", a); // a = 10
复制代码

a 没有使用 clone 还能使用, 原因是 Rust 有部分类型默认实现了 std::marker::Copy trait, 也就是整型浮点型这类基本类型. 像 structs 这类没有默认实现的类型, 想要这样就得实现一下 Copy .

fn main() {
    let p1 = Point { x: 1.0, y: 1.0 };
    let p2 = p1;
    println!("p1 = {:?}", p1);
}

#[derive(Debug)]
struct Point {
    x: f64,
    y: f64,
}

impl Copy for Point {}
复制代码

但是其实这样还是没法用的, 编译后就报错了, 因为 struct Point 没有实现 Clone trait.

pub fn main_8_6() {
    let p1 = Point { x: 1.0, y: 1.0 };
    let p2: Point = p1;
    println!("p1 = {:?}", p1);
}

#[derive(Debug)]
struct Point {
    x: f64,
    y: f64,
}

impl Clone for Point {
    fn clone(&self) -> Self {
        Self { x: self.x, y: self.y }
    }
}

impl Copy for Point {}
复制代码

现在终于好使了. 但是我们发觉做这些操作非常烦, 我们注意到 #[derive(Debug)] 这个东西, 刚好 Rust 提供了 Clone , Copy 的属性.

pub fn main_8_6() {
    let p1 = Point { x: 1.0, y: 1.0 };
    let p2: Point = p1;
    println!("p1 = {:?}", p1);
}

#[derive(Debug, Clone, Copy)]
struct Point {
    x: f64,
    y: f64,
}
复制代码

Rust 默认绑定变量是进行 move 行为, 想要保留 move 前的变量, 可以使用 clone 函数, 想要实现基本类型一样的 copy 行为, 我们可以添加 Clone , Copy 属性.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

大学的终结

大学的终结

[美] 凯文·凯里(Kevin Carey) / 朱志勇、韩倩 / 人民邮电出版社 / 2017-2-28 / 59.00

你了解目前全球高等教育的现状吗?你知道高等教育的未来是什么样的吗?你听说过泛在大学吗?翻开本书,了解大学的过去、现在与未来。 《大学的终结:泛在大学与高等教育革命》一书由美国著名教育作家凯文? 凯里倾情打造。作者在书中详细论述了美国大学的历史变迁、大学的本质、大学的未来、信息技术与教育的关系、泛在大学的定义、传统大学在大趋势下的挣扎,以及未来高等教育的学历认证与呈现形式。本书作者用缜密的逻辑......一起来看看 《大学的终结》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具