• 一个人旅行
    2023-10-26 来自北京
    问题1. 所有权型变量被借用时,不能对所有权型变量进行修改。 问题2. 同一时刻,所有权型变量只能有一个可变引用或多个不可变引用。如果复制,则会有多个不可变引用,违反了借用规则。

    作者回复: 不错。

    
    3
  • FRANK
    2023-10-26 来自安徽
    1. 不可变引用的作用域跨越了所有权变量的写入过程,意味着同一个作用域同时存在可变引用和不可变引用,编译器为了防止读取错误,不能通过编译。可以把a = 20放到引用之前,即可编译通过。 2. 可变引用如果可以Copy,就违反了可变引用不能同时存在的规则,因此只能Move. 跟唐老师学习我觉得我理解能力变强了,感谢唐老师的课程,扫清了很多基础的迷雾。

    作者回复: 很棒,对的,基础扫清了才能启航远洋。

    
    2
  • -Hedon🍭
    2023-10-25 来自湖北
    1. 不可变引用的语义更像是“借一下这个值使用一下”,如果在不可变引用作用域结束之前,对所有权变量进行写入,那么这个借的“值”,就没有意义了,因为不确定是否跟想借的时候是一致的。 2. 如文中所说,可变引用的作用域不能交叉,如果采用 copy,则两份可变引用其实是互不影响的,即可以交叉,就产生矛盾了。

    作者回复: 很棒。

    
    1
  • 刘永臣
    2023-10-25 来自北京
    问题1:所有权借出时,原所有权变量不能操作; 问题2:引用的复制实际上是所有权的借出,类似于所有权转移,不是复制数据。

    作者回复: 对的。2,写清楚可变引用比较好。

    
    1
  • Michael
    2023-10-26 来自中国香港
    想请问下下面这段代码,为什么变量b之前的mut是必须的,变量c之前不需要: fn main() { let mut a1 = 10u32; let mut b = &mut a1; *b = 20; let c = &mut b; **c = 30; // 多级解引用操作 println!("{c}"); }

    作者回复: 因为后面c要对b进行可变借用。这样,语法上就要求b在前面加mut修饰。你如果后面再有d对c进行可变借用,那么你试试,c也需要加mut修饰的。

    共 2 条评论
    
  • Geek_004fb2
    2023-10-26 来自湖北
    1.明确声明的是不可变借用,拥有所有权的如果能改变值,那么对我这个不可变借用来说是不安全的 2.如果Copy的话,违背了可变引用独占的原则

    作者回复: 对的。👍

    
    
  • 励研冰
    2023-10-26 来自上海
    从语意上保证了安全性,不可变引用语意:从此刻开始到我的运用域结束,原始值请保持我开始的状态,不然就破坏了我的不可变引用的语;可变引用同样的道理;。类似于mysql中的可重复读事物,不过mysql的实现方式是通过mvcc ,为了提高并发度;而rust是限制修改,更像是排斥锁,不允许交叉;不过这样的话不知道后面的 无谓并发 在对同一个数据的修改上会不会有什么问题

    作者回复: 思考得很棒,后面会看到关于所有权在并发中的处理相关内容。

    
    
  • 二夕Thrower
    2023-10-26 来自浙江
    思考题 1:第三行创建了一个不可变引用,它会借用原始变量 a 的所有权,为了避免潜在的数据竞争和不确定性,a 在借用期间不能修改; 思考题 2:Rust 借用规则中有说:一次只能由一个可变引用或多个只读引用。如果允许复制可变引用,就可能会导致多个可变引用同时存在,并同时修改同一个值,违反了 Rust 的借用规则。所以为了避免这种情况,Rust 禁止了可变引用的复制,只允许移动操作。

    作者回复: 棒

    
    