basic/ownership/ownership #690
Replies: 98 comments 87 replies
-
写得太好啦,对入门及其友好 |
Beta Was this translation helpful? Give feedback.
-
所有权从s1 move 到s2后,s1在栈上的空间是在离开作用域后,这个空间才会被释放吗? |
Beta Was this translation helpful? Give feedback.
-
Rust:”可以帮你开辟变量空间,但用完必须马上还我“ |
Beta Was this translation helpful? Give feedback.
-
1 Rust 中每一个值都 有且只有 一个所有者(变量) 是否可以理解为 Rust 每一块内存空间都只能被 一个变量使用呢? |
Beta Was this translation helpful? Give feedback.
-
原文:
中文:
这里感觉翻译地特别到位,一个是没必要合并翻译,另一个是合并后含义有些改动。 |
Beta Was this translation helpful? Give feedback.
-
有个疑惑, 像 Swift 这种依赖于自动引用计数的, 他是通过在编译的时候插入内存管理代码, 感觉比 Rust 还轻松呢. |
Beta Was this translation helpful? Give feedback.
-
函数返回,不相当于离开了作用域吗
LAIN ***@***.***> 于2022年4月16日周六 17:34写道:
… 处于栈上的数据都是在函数返回时会释放吧,不一定是作用域
—
Reply to this email directly, view it on GitHub
<#690 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ADKZIT52TGBW57ZINQ3TLPLVFKCR7ANCNFSM5SIJA2HQ>
.
You are receiving this because you commented.Message ID:
***@***.***>
|
Beta Was this translation helpful? Give feedback.
-
我推测了一下理解下来的一个变量的生命周期:
这样的话, 形式上就实现了所谓的所有权. 这样理解正确吗? |
Beta Was this translation helpful? Give feedback.
-
小疑问: |
Beta Was this translation helpful? Give feedback.
-
这里的 “的” 应该用 “地” 😅 |
Beta Was this translation helpful? Give feedback.
-
和C++对比一下就是,Rust中基本类型的赋值操作表现出copy的行为,复合类型的赋值操作表现出move的行为,如果想让复合类型的赋值操作表现出copy的行为,就要显式的调用clone |
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
这个例子里: fn main() {
let x: &str = "hello, world";
let y = x;
println!("{},{}",x,y);
}
|
Beta Was this translation helpful? Give feedback.
-
Rust 的所有权实现了 RAII(Resource Acquisition Is Initialization programming) 原则,实际上 C++ 里面的智能指针也是按这个原则实现的。 |
Beta Was this translation helpful? Give feedback.
-
可以简单理解拷贝堆内存的东西就是深拷贝 拷贝栈内存的就是浅拷贝么 |
Beta Was this translation helpful? Give feedback.
-
有个偏题的问题: 代码中的 let mut s = String::from("hello");
s.push_str(", world!"); // push_str() 在字符串后追加字面值
println!("{}", s); // 将打印 `hello, world!` 为什么不可以是 |
Beta Was this translation helpful? Give feedback.
-
请问文中最后一个例子函数返回 some_string 时是保留堆中的内存不变只把指针传给 s2 ,然后再在函数中将已经失效的所有者 some_string 移出作用域;还是在函数结束时只把内容传出去,然后把 some_string 这块内存 drop 掉,然后在 main 中为 s2 重新申请一块内存空间存储对应内容绑定 s2 呢? |
Beta Was this translation helpful? Give feedback.
-
所以常量没有“所有者” |
Beta Was this translation helpful? Give feedback.
-
刚开始不了解为什么二次释放会内存污染, 我觉得第二次如果检查到不存在忽略不就好了吗, 随后去查: |
Beta Was this translation helpful? Give feedback.
-
let 穷逼的女朋友=String::from("明星高圆圆");
let 赵又廷的老婆=穷逼的女朋友;
println!("现在给大家介绍一下,这位是穷逼的女朋友{}!", 穷逼的女朋友); 运行结果如下: error[E0382]: 女票被移动: `穷逼的女朋友`
--> src/main.rs:5:28
|
2 | let 穷逼的女朋友=String::from("明星高圆圆");
| --编译器:"我承认,这时候高圆圆的确是你的女票"
3 | let 赵又廷的老婆=穷逼的女朋友;
| -- 编译器:"但是,你看看这里,你把你女朋友送给了赵又廷"
4 |
5 | println!("现在给大家介绍一下,这位是穷逼的女朋友{}!", 穷逼的女朋友);
| ^^ 所以你装逼失败
|
= note: 下次不要随便把女朋友送给任何人,容易被绑架,我把你这种行为叫做变量绑架,哦,不对,应该是变量绑定
|
3 | let 赵又廷的老婆=穷逼的女朋友.clone();
| ++++++++如果科技发达的哪一天,我还是建议你克隆一个女票送他
关于更多丢失女朋友的问题, 请看`rustc --explain E0382`. |
Beta Was this translation helpful? Give feedback.
-
这个所有权 我个人觉得和java是一样的 只是java不立刻回收堆 |
Beta Was this translation helpful? Give feedback.
-
以前的语言,语法和标准库基本上没多少关系,但现在的语言和标准库耦合严重,导致难以理解。 |
Beta Was this translation helpful? Give feedback.
-
s1到s2的move,为什么除指向堆数据的指针之外还额外拷贝了字符串的长度和容量?这一点是如何体现的, |
Beta Was this translation helpful? Give feedback.
-
fn makes_copy(some_integer: i32) { // some_integer 进入作用域
println!("{}", some_integer);
} // 这里,some_integer 移出作用域。不会有特殊操作 不会有特殊操作? 个人理解,在 makes_copy 函数中,some_integer 是一个局部变量,在离开作用域后,也是会被 drop 掉 |
Beta Was this translation helpful? Give feedback.
-
有两段代码: fn main() { |
Beta Was this translation helpful? Give feedback.
-
关于文中提到的:“不可变引用 &T ,例如转移所有权中的最后一个例子,但是注意: 可变引用 &mut T 是不可以 Copy的”,我有一些疑惑,既然可变引用 &mut T没有copy 特征,那么不就意味着可变引用传入函数后,后续代码将无法继续使用这个可变引用吗?但是我实际测试发现,函数调用并没有发生可变引用的move:
} |
Beta Was this translation helpful? Give feedback.
-
这里的s1移动到了s2,改成s1改名为s2会不会更好理解 let s1 = String::from("hello");
let s2 = s1; |
Beta Was this translation helpful? Give feedback.
-
我理解的转移所有权是这样的:基本类型的所有权就相当于小学的时候快收上去的作业本,每本作业本上的名字就是声明的变量,值就是作业的内容,因为内容简单我自己拿同桌的过来抄一份就还回去,虽然内容一样,但是有我的署名啊,对老师来说就是两份;非基本类型的所有权就相当于作业的内容太多了,时间来不及啊(好的,那现在这作业本就是我的了),我直接把同桌的作业本上的名字擦掉改成我自己的(这TM妥妥的明抢啊),后面老师检查作业本的时候发现有你的作业,在老师看来你同桌的作业本确实是没了。 |
Beta Was this translation helpful? Give feedback.
-
我有笔和手机 。 笔便宜,给你或者借给你用都可以 但是手机不行 死我也要带着手机一起走。我是手机的拥有者,我可以改名(变量名),但我(内存地址)还是我。 |
Beta Was this translation helpful? Give feedback.
-
Java / JS 应该没有悬空指针的问题~ |
Beta Was this translation helpful? Give feedback.
-
basic/ownership/ownership
https://course.rs/basic/ownership/ownership.html
Beta Was this translation helpful? Give feedback.
All reactions