difficulties/move-copy #797
Replies: 5 comments 9 replies
-
太酷了,书还可以这样写 |
Beta Was this translation helpful? Give feedback.
-
作者没写,我来写点。(doge)
#[derive(Debug)]
struct O {
a: i32,
}
impl Copy for O {}
impl Clone for O {
fn clone(&self) -> Self {
Self { a: 123 }
}
}
fn main() {
let b = O { a: 1 };
let c = b;
let d = b.clone();
println!("b:{b:?},c:{c:?},d:{d:?}");
} 显示
// 使用宏
#[derive(Clone,Copy)]
struct O {
a: i32,
}
// 手动
struct O {
a: i32,
}
impl Copy for O {
// 什么也不用写,毕竟是一个标记trait
}
impl Clone for O {
fn clone(&self) -> Self {
// * self 还是 Self {..} 或者其他的实现方式。
// 随便,不会对Copy行为产生影响,但是必须实现Clone,才能实现Copy。
}
} 个人的进一步理解
let a = Box::new(1);
let b = a; 这里通过
PS: 如何保证会在栈?rust 本身只给基本类型实现了 #[derive(Debug, Clone, Copy)]
struct O {
a: i32,
b: Box<i32>,
}
// 这个就会报错,说Box没有实现Copy,
// 然后由于孤儿规则,我们不能去为Box实现Copy
// newtype也由于 Copy 要求结构体属性的类型也实现Copy,而无法为Box实现Copy
let a = b.clone(); // b.clone()就是直接返回的*self
//上面的等价于下面的
let a = b; //因为实现了`Copy`所以不会有所有权转移。 至于为何要实现了
|
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
difficulties/move-copy
http://localhost:8080/difficulties/move-copy.html
Beta Was this translation helpful? Give feedback.
All reactions