basic/ownership/ownership #690
Replies: 86 comments 78 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.
-
打卡,讲解的很清楚,尤其是从堆栈再延伸到 所有权的概念 |
Beta Was this translation helpful? Give feedback.
-
let mut x: String=String::from("hello world");
x={let s: String=x;s};//x移动给了s,为什么x还可以继续用
println!("{x}");
{let s:String=x;}
println!("{x}");//这里会报错 有大佬可以解释下这个问题吗 |
Beta Was this translation helpful? Give feedback.
-
建议在“变量绑定背后的数据交互”之前先介绍一下所有权和垃圾回收机制,并且使用基础数据类型来举例,然后再讲述转移和String类型,否则会有些跳脱,官方文档在这部分就写的比较好,可以作为参考 |
Beta Was this translation helpful? Give feedback.
-
类比java或者其他高级语言来说,基本类型的 |
Beta Was this translation helpful? Give feedback.
-
形象理解规则: 想象你有一个苹果,这个苹果是一个值,而你是这个值的所有者。这个苹果只能被你一个人所拥有,其他人不能同时拥有这个苹果。 现在,如果你把这个苹果放在桌子上(作用域范围),你仍然是它的所有者,因为只有你能够拿起它或者控制它。但是,一旦你离开了房间(作用域范围),你就无法再控制这个苹果了。在这种情况下,这个苹果会被丢弃,因为没有人能够继续拥有它。 换句话说,在 Rust 中,变量是值的所有者,当变量(所有者)离开了作用域范围时,对应的值就会被丢弃。就像你离开了房间,苹果就被丢弃了一样。这种所有权模型确保了内存的安全性和有效性,因为每个值都有一个明确的所有者,并且内存管理是在编译时进行的,避免了内存泄漏和悬空引用等问题。 |
Beta Was this translation helpful? Give feedback.
-
“这段代码并没有发生所有权的转移,原因很简单: 代码首先将 5 绑定到变量 x,接着拷贝 x 的值赋给 y,最终 x 和 y 都等于 5,因为整数是 Rust 基本数据类型,是固定大小的简单值,因此这两个值都是通过自动拷贝的方式来赋值的,都被存在栈中,完全无需在堆上分配内存。 我觉得对于这段话,更通俗的理解是: |
Beta Was this translation helpful? Give feedback.
-
最后这里的注释没有看明白 这里不应该是复制,就有2份,那复制进去的这份,在函数执行完成后 还是说,这里只是一个入栈跟出栈,原来的变量还在栈内没有释放? |
Beta Was this translation helpful? Give feedback.
-
无处不再call某加加 |
Beta Was this translation helpful? Give feedback.
-
为啥作者与其他编程语言对比的时候都不提C语言呢 |
Beta Was this translation helpful? Give feedback.
-
“当 s1 和 s2 离开作用域,它们都会尝试释放相同的内存” |
Beta Was this translation helpful? Give feedback.
-
fn main() {
} // 这里, x 先移出了作用域,然后是 s。但因为 s 的值已被移走, fn takes_ownership(some_string: String) { // some_string 进入作用域 fn makes_copy(some_integer: i32) { // some_integer 进入作用域 最后的some_integer不是被copy了一份吗,为什么不需要特殊操作? |
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.
-
basic/ownership/ownership
https://course.rs/basic/ownership/ownership.html
Beta Was this translation helpful? Give feedback.
All reactions