- 主题:闭包move声明后,域外的变量仍然可以访问和修改,是否闭包的规
还有一个 栈上的copy trait ,复制后 新的变量离开作用域 可以调用drop 旧的就不调用
都不清楚 rust编译器是根据实际的value调用drop 还是维护符号表变量 只有有效的变量才调用drop
【 在 kawolu 的大作中提到: 】
: 编译器或者解释器优化,我认为不属于语言特性,而是编译器的便宜之法。
: rust的乱我还没看到...不同类型的工作交织进行,看得很慢。
:
--
FROM 223.104.40.*
感觉如果能把这些逻辑还原到C的行为,理解起来应该很容易。
【 在 nextworld8 的大作中提到: 】
: 还有一个 栈上的copy trait ,复制后 新的变量离开作用域 可以调用drop 旧的就不调用
: 都不清楚 rust编译器是根据实际的value调用drop 还是维护符号表变量 只有有效的变量才调用drop
--
FROM 1.202.141.*
嗯
原先 闭关堆c++的 [] 获取值和引用 觉得和啰嗦 现在用到rust 感觉c++的规则突然很清晰
还有一个定义类型别人 rust 可以用type关键字 既然也看到很多代码直接可以把元组struct复制给变量
java之类 至少还以class类型的形式复制
rust直接把元组struct当作fn类型处理
【 在 kawolu 的大作中提到: 】
: 感觉如果能把这些逻辑还原到C的行为,理解起来应该很容易。
:
--
FROM 223.104.40.*
rust文档哪里不清晰?我觉得清晰得不能再清晰了呀,在 内存管理这块。。。
【 在 nextworld8 的大作中提到: 】
: 有点类似 又有点不同
: java靠运行时gc管理堆对象 在逃逸分析编译器优化后 new可能被优化到栈
: rust通过在编译时自动生成一些释放资源的代码 编译器没那么智能 只能预定一些规范
: ...................
--
FROM 123.120.183.*
好 你说的都对
【 在 beep 的大作中提到: 】
: rust文档哪里不清晰?我觉得清晰得不能再清晰了呀,在 内存管理这块。。。
:
--
FROM 223.104.40.*
为什么栈可以接着用,堆就不能用。 搞出这一套所有权转移语法到底有什么意义。
【 在 nextworld8 的大作中提到: 】
: let mut x = 10;
: let add_x = move |y| x + y;
: println!("{}", add_x(5)); // 输出 15
: ...................
--
修改:zhangxp024 FROM 36.7.226.*
FROM 36.7.226.*
这个问题和堆、栈没有直接关系,有关系的是有没有实现Copy trait.
所有权转移是为了实现类型安全、内存安全,这是rust的核心特性。目前为止,在编译期间
解决内存安全问题,仅rust一家而已,这就是意义。
【 在 zhangxp024 的大作中提到: 】
: 什么栈可以接着用,堆就不能用。 搞出这一套所有权转移语法到底有什么意义。
--
FROM 116.237.127.*
也就是说,整型12实现了所谓的copy trait, 字符串则没有实现copy trait?
【 在 RunningOn 的大作中提到: 】
: 这个问题和堆、栈没有直接关系,有关系的是有没有实现Copy trait.
: 所有权转移是为了实现类型安全、内存安全,这是rust的核心特性。目前为止,在编译期间
: 解决内存安全问题,仅rust一家而已,这就是意义。
: ...................
--
FROM 36.7.226.*
对
【 在 zhangxp024 的大作中提到: 】
: 也就是说,整型12实现了所谓的copy trait, 字符串则没有实现copy trait?
--
FROM 116.237.127.*
那为什么编译器要这么做呢?而不是反过来?
AI给我的copy trait的解释:
在Rust中,Copy trait 是一个标记 trait(marker trait),用于指示类型可以通过简单的位复制(bitwise copy)来复制值。当一个类型实现了 Copy trait 时,它的值在赋值、函数参数传递或返回时会自动进行拷贝,而不是移动所有权。
Copy Trait 的关键特性
自动拷贝:
实现了 Copy 的类型在赋值或函数调用时会自动进行值的拷贝,而不是移动所有权。
例如,基本数据类型(如 i32、f64、bool 等)都默认实现了 Copy。
与 Clone 的关系:
Copy 是 Clone 的子 trait,即所有实现了 Copy 的类型也必须实现 Clone。
Clone trait 提供了更复杂的拷贝逻辑,允许自定义拷贝行为,而 Copy 则是简单的位复制。
实现 Copy:
可以通过 #[derive(Copy, Clone)] 自动为类型实现 Copy 和 Clone。
如果类型的所有字段都实现了 Copy,则该类型也可以实现 Copy。
适用场景:
适用于小型、简单的类型,如整数、浮点数、布尔值等。
如果类型包含堆分配的资源(如 String 或 Vec),则不应实现 Copy,因为简单的位复制会导致双重释放(double free)问题。
示例代码
rust
复制
#[derive(Copy, Clone)]
struct Point {
x: i32,
y: i32,
}
fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = p1; // p1 被复制到 p2,而不是移动
println!("p1: ({}, {})", p1.x, p1.y); // p1 仍然有效
println!("p2: ({}, {})", p2.x, p2.y);
}
Copy 与 Clone 的区别
Copy:
自动拷贝,无需显式调用。
适用于简单类型,如整数、浮点数等。
Clone:
需要显式调用 .clone() 方法。
可以提供更复杂的拷贝逻辑,适用于需要深拷贝的类型。
何时实现 Copy
如果你的类型可以安全地通过位复制来复制值,且不会导致资源管理问题(如双重释放),则可以实现 Copy。
如果类型包含堆分配的资源或需要特殊拷贝逻辑,则应使用 Clone。
希望这些信息能帮助你更好地理解 Rust 中的 Copy trait。如果有其他问题,请随时提问!
【 在 RunningOn 的大作中提到: 】
: 对
:
--
修改:zhangxp024 FROM 36.7.226.*
FROM 36.7.226.*