- 主题:闭包move声明后,域外的变量仍然可以访问和修改,是否闭包的规
let mut x = 10;
let add_x = move |y| x + y;
println!("{}", add_x(5)); // 输出 15
x=13;
println!("{}", x); // 仍然可以使用 x
---
通过讨论后发现
move作为语义关键字 本身栈内存数据是复制的 对于有堆的 变量 move之后 原有变量再使用 编译器检查不通过
原先一直以为 编译器也会对栈上的原有内存做一些操作 其实没啥操作 move之后 再使用 编译不通过
语法上的约束 底层实现其实没做啥
栈上的内存随函数调用返回后释放
--
修改:nextworld8 FROM 223.104.40.*
FROM 223.104.40.*
估计是 栈上的直接复制了
- 来自 水木社区APP v3.5.7
【 在 tsa300 的大作中提到: 】
: 因为move的是 i32,i32实现了copy trait
: --
:
--
FROM 223.104.40.*
估计所有权只主要针对数据在堆上的,如果数据在栈上 直接复制了
rsut的语法好奇葩
--
FROM 223.104.40.*
ok
看了规范 和堆栈也没有明确的关系
还是编译器约束导致的 只有实现了copy trait的才可以直接复制
【 在 tsa300 的大作中提到: 】
: 不用估计,你把 i32 换成 Vec 或 String , 编译器会拒绝编译,并且告诉你因为 Vec/String 没实现 Copy trait 所以move后不能再使用了。
:
--
FROM 223.104.40.*
有点类似 又有点不同
java靠运行时gc管理堆对象 在逃逸分析编译器优化后 new可能被优化到栈
rust通过在编译时自动生成一些释放资源的代码 编译器没那么智能 只能预定一些规范
通过是又需要对一些特定逻辑进行修补 所以rust很多限定词用法 很乱
的确 文档很不清晰 估计想让使用者认为rust是道 抽象的不普遍又有特定的规则 不得不到处打补丁的术
【 在 kawolu 的大作中提到: 】
: 其实就是java里面有没有new的区别,rust的文档在这块没有特意写明白。
:
--
修改:nextworld8 FROM 223.104.40.*
FROM 223.104.40.*
例如 函数返回值 要求固定的size的类型 可以返回impl trait 当时如果返回不同实现的可能具有不同属性 又可能size不固定
需要用到box<dyn Trait>
最近经常搞得头乱
【 在 kawolu 的大作中提到: 】
: 编译器或者解释器优化,我认为不属于语言特性,而是编译器的便宜之法。
: rust的乱我还没看到...不同类型的工作交织进行,看得很慢。
:
--
修改:nextworld8 FROM 223.104.40.*
FROM 223.104.40.*
还有一个 栈上的copy trait ,复制后 新的变量离开作用域 可以调用drop 旧的就不调用
都不清楚 rust编译器是根据实际的value调用drop 还是维护符号表变量 只有有效的变量才调用drop
【 在 kawolu 的大作中提到: 】
: 编译器或者解释器优化,我认为不属于语言特性,而是编译器的便宜之法。
: rust的乱我还没看到...不同类型的工作交织进行,看得很慢。
:
--
FROM 223.104.40.*
嗯
原先 闭关堆c++的 [] 获取值和引用 觉得和啰嗦 现在用到rust 感觉c++的规则突然很清晰
还有一个定义类型别人 rust 可以用type关键字 既然也看到很多代码直接可以把元组struct复制给变量
java之类 至少还以class类型的形式复制
rust直接把元组struct当作fn类型处理
【 在 kawolu 的大作中提到: 】
: 感觉如果能把这些逻辑还原到C的行为,理解起来应该很容易。
:
--
FROM 223.104.40.*
好 你说的都对
【 在 beep 的大作中提到: 】
: rust文档哪里不清晰?我觉得清晰得不能再清晰了呀,在 内存管理这块。。。
:
--
FROM 223.104.40.*