- 主题:闭包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.*
因为move的是 i32,i32实现了copy trait
--
FROM 123.125.204.*
估计是 栈上的直接复制了
- 来自 水木社区APP v3.5.7
【 在 tsa300 的大作中提到: 】
: 因为move的是 i32,i32实现了copy trait
: --
:
--
FROM 223.104.40.*
估计所有权只主要针对数据在堆上的,如果数据在栈上 直接复制了
rsut的语法好奇葩
--
FROM 223.104.40.*
不用估计,你把 i32 换成 Vec 或 String , 编译器会拒绝编译,并且告诉你因为 Vec/String 没实现 Copy trait 所以move后不能再使用了。
【 在 nextworld8 的大作中提到: 】
: 估计是 栈上的直接复制了
: - 来自 水木社区APP v3.5.7
: :
--
FROM 123.120.12.*
ok
看了规范 和堆栈也没有明确的关系
还是编译器约束导致的 只有实现了copy trait的才可以直接复制
【 在 tsa300 的大作中提到: 】
: 不用估计,你把 i32 换成 Vec 或 String , 编译器会拒绝编译,并且告诉你因为 Vec/String 没实现 Copy trait 所以move后不能再使用了。
:
--
FROM 223.104.40.*
其实就是java里面有没有new的区别,rust的文档在这块没有特意写明白。
【 在 nextworld8 的大作中提到: 】
: ok
: 看了规范 和堆栈也没有明确的关系
: 还是编译器约束导致的 只有实现了copy trait的才可以直接复制
: ...................
--
FROM 1.202.141.*
有点类似 又有点不同
java靠运行时gc管理堆对象 在逃逸分析编译器优化后 new可能被优化到栈
rust通过在编译时自动生成一些释放资源的代码 编译器没那么智能 只能预定一些规范
通过是又需要对一些特定逻辑进行修补 所以rust很多限定词用法 很乱
的确 文档很不清晰 估计想让使用者认为rust是道 抽象的不普遍又有特定的规则 不得不到处打补丁的术
【 在 kawolu 的大作中提到: 】
: 其实就是java里面有没有new的区别,rust的文档在这块没有特意写明白。
:
--
修改:nextworld8 FROM 223.104.40.*
FROM 223.104.40.*
编译器或者解释器优化,我认为不属于语言特性,而是编译器的便宜之法。
rust的乱我还没看到...不同类型的工作交织进行,看得很慢。
【 在 nextworld8 的大作中提到: 】
: 不太一样的哟 java靠运行时gc管理对象 new可能被优化到栈
: rust通过在编译时自动生成一些释放资源的代码 编译器没那么智能 只能预定一些规范
: 通过是又需要对一些特定逻辑进行修补 所以rust很多限定词用法 很乱
: ...................
--
FROM 1.202.141.*
例如 函数返回值 要求固定的size的类型 可以返回impl trait 当时如果返回不同实现的可能具有不同属性 又可能size不固定
需要用到box<dyn Trait>
最近经常搞得头乱
【 在 kawolu 的大作中提到: 】
: 编译器或者解释器优化,我认为不属于语言特性,而是编译器的便宜之法。
: rust的乱我还没看到...不同类型的工作交织进行,看得很慢。
:
--
修改:nextworld8 FROM 223.104.40.*
FROM 223.104.40.*