内容简介: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
属性.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Go 语言内存管理(二):Go 内存管理
- Objective-C的内存管理(1)——内存管理概述
- [译] 图解 Go 内存管理与内存清理
- 图解 Go 内存管理器的内存分配策略
- Go:内存管理分配
- Redis内存管理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JSP信息系统开发实例精选
赛奎春 / 机械工业出版社 / 2006-1 / 44.00元
本书精选了大学生就业求职网、物流短信平台、化奥汽车销售集团网站、佳美网络购物中心、科研成果申报管理系统、安瑞奥国际商务不院招生网、明日宽带影院、雄霸天下游戏网等8个综合的网络信息系统工程作为案例,深入剖析了实际的网络信息系统的开发思路、方法和技巧。帮助读者透彻掌握JSP开发网络信息系统的方法和步骤,从而设计出具有实用价值和商用价值的信息系统。 本书产例具有很强的实用性和工程实践性,在讲解......一起来看看 《JSP信息系统开发实例精选》 这本书的介绍吧!