English 中文(简体)
为什么在Rust没有允许提及不可复制的数据?
原标题:why dereferences of references to non-copyable data do not have the O permission to avoid double-frees in Rust?
  • 时间:2024-03-28 02:24:09
  •  标签:
  • rust

I m new to Rust and when Iread a book ( https://rust-book.cs.brown.edu/ch04-05- Ownership-recap.html)。

提及不可复制数据时,不准许O避免双重豁免

O许可是物体的所有权。 只可能存在物体的所有人,因此,提及不能转让诸如“Sting”等不可复制类型的所有权。 如果两个变量认为它们拥有同样的界限,那么这两个变量都会试图加以定位,造成双重自由。

认为我们有以下法典:

    let v = vec![1, 2, 3];
    let v_ref: &Vec<i32> = &v;
    let v2 = *v_ref;
    // drop(v2);
    // drop(v);

编辑会抱怨:

error[E0507]: cannot move out of `*v_ref` which is behind a shared reference
  --> src/main.rs:32:14
   |
32 |     let v2 = *v_ref;
   |              ^^^^^^ move occurs because `*v_ref` has type `Vec<i32>`, which does not implement the `Copy` trait

...... 如果我们直接宣布变数为变数2,然后将 v2,那么情况如何?

    let v = vec![1, 2, 3];
    let v2 = v;

由于vec的移动,该编码可操作。 因此,没有双重限制? 它会下降吗?

我混淆了why,我们使用了参考文献的精髓,它指的是赢得t move,如上面的代码,以防止双重自由?

这是Rust的一条具体规则吗? 是否应当使守则的流通更加清楚(通过明确采取行动避免通过疏漏进行意外转移)? 我是否只是需要记住和遵守?

问题回答

由于vec的移动,该编码可操作。 因此,没有双重限制? 它会下降吗?

无。 从变数来看,它是一个非常相似的“脱离”国家,与“未初始化”相类似(从语义上来说,几乎完全相同;如果你试图将其用于非派任目标,则汇编者告诉你的话,则大不相同)。 http://codev>上标有“去除”和v2。 现在拥有价值。 <代码>v 不能再查阅,在范围外,不会为之 drop。

我很想知道,为什么我们利用参考文献的欺骗性,它指的是像法律上那样的胜利,以防止双重自由?

由于许多原因,你不能回避。 一种是实际的:如果你提到某项职能,而职能将价值从中转移,那么该职能便无法表明现在的价值已经达到。 另一种是属人性的:给予某个人对价值的共同提及,并不让他们允许取得价值。

There is a kind of special case though: exclusive references (&mut). Similar to the shared reference case, you can t communicate that the referent was taken, so in general a simple move won t work. However, you are allowed to "steal" the value if you leave behind a valid value! This is the premise behind the take and replace functions.

let mut v = vec![1, 2, 3];
let v_ref = &mut v;

// The following line takes the Vec from v via the reference,
// replacing it with an empty one.
let v2 = std::mem::take(v_ref);

assert_eq!(&v2[..], &[1, 2, 3]);
assert!(v.is_empty());




相关问题
Creating an alias for a variable

I have the following code in Rust (which will not compile but illustrates what I am after). For readability purposes, I would like to refer the same string with two different names so that the name of ...

Rust Visual Studio Code code completion not working

I m trying to learn Rust and installed the Rust extension for VSCode. But I m not seeing auto-completions for any syntax. I d like to call .trim() on String but I get no completion for it. I read that ...

热门标签