我目前正在学习Ruust,我正在试验向量,正如文档中提到的,Vect模块的Push方法的签名如下:

pub fn push(&mut self, value: T)

从上面我们可以看出,Push方法接受变量本身,而不是对名为"Value"的变量的引用(显然),因此它获得了它的所有权,因此,在使用Push方法之后,使用传递到参数中的值不再可行. 但是,在我编译并执行了以下代码片段之后,就可以使用它了

let mut v = vec![1, 2, 3, 4, 5];
let mut x = 10;
v.push(x);
println!("{:?}", v);
x = 20;
println!("{}", x);
println!("{:?}", v);

我没有遇到任何编译或运行时错误,我真的很想知道为什么会这样,因为我对签名的理解是混乱的,或者有一些我不知道的东西,我想知道.

推荐答案

摘自《编程铁 rust (修订版第2版)》,第4章:所有权和移动,第94-95页:

Copy Types: The Exception to Moves
...
...
Assigning a value of a Copy type copies the value, rather than moving it. The source of the assignment remains initialized and usable, with the same value it had before. Passing Copy types to functions and constructors behaves similarly.

标准复制类型包括所有机器整数和 浮点数值类型、char和bool类型以及一些 其他.副本类型的元组或固定大小数组本身就是副本 打字.

最后一行的示例:

let x = [2, 4, 6];
let y = x;
println!("From x: {}", x[0]);
println!("From y: {}", y[0]);

--output:--
From x: 2
From y: 2

Rust相关问答推荐

无需通过ASIO输入音频,并使用cpal进行反馈示例

如何从Rust记录WASM堆内存使用情况?

Arrow RecordBatch as Polars DataFrame

MacOS(AARCH64)上Ghidra中的二进制补丁导致进程终止

限制未使用的泛型导致编译错误

告诉Rust编译器返回值不包含构造函数中提供的引用

为什么Deref类特征不构成?

考虑到Rust不允许多个可变引用,类似PyTorch的自动区分如何在Rust中工作?

如何轮询 Pin>?

如何对一个特征的两个实现进行单元测试?

如何使用tracing-subscriberRust crate 构建多编写者、全局过滤订阅者

Rust 并行获取对 ndarray 的每个元素的可变引用

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

Rust中的一生语法有什么作用?

如何将这些测试放在一个单独的文件中?

SDL2 没有在终端键上触发?

为什么基于 clap::Parser 读取的大量数字进行计算比硬编码该数字时慢?

为什么 match 语句对引用类型比函数参数更挑剔?

如何为枚举中的单个或多个值返回迭代器

基于名称是否存在的条件编译