rust - 函数,可变借用

标签 rust ownership

我正在尝试了解所有权系统。为了测试它,我想创建一个借用 Vec 的函数,向其添加一个值并返回该值:

fn test(v1: &mut Vec<i32>) -> i32 {    
    *v1.push(10);    
    v1[3]
}

fn main() {
    let mut vec: Vec<i32> = vec![10, 20, 30];
    let i: <i32> = test(&mut vec);
}

我得到这两个错误:

error: expected `::`, found `=`
 --> src/main.rs:8:16
  |
8 |   let i: <i32> = test(&mut vec);
  |                ^

error: type `()` cannot be dereferenced
 --> src/main.rs:2:5
  |
2 |     *v1.push(10);    
  |     ^^^^^^^^^^^^

= 更改为 :: 没有帮助,我不明白为什么会这样。

最佳答案

你不应该用 <> 包装所有类型. <>意味着你想指定一个泛型参数。这足够了:

let i: i32 = /* value */;

此外,您根本不需要指定类型,编译器会自行推断类型。你可以只写:

let mut vec = vec![10, 20, 30];

let i = test(&mut vec);

这应该可以解决您的第二个问题。

第一个错误是因为您试图取消引用 () ,这根本不是引用。

在 C(和 C++)中,我们有 2 种不同的访问运算符:

  • .它允许您访问结构字段(和 C++ 中的方法)
  • ->它允许您访问指针后面的结构的字段

Rust 向您隐藏了这些细节,所以您只需要使用 .运营商。

Vec::<T>::push(&mut vec, val: T) 的类型意味着它返回 () (单位类型)。要解决此问题,请删除 * :

fn test(v1: &mut Vec<i32>) -> i32 {
    v1.push(10);

    v1[3]
}

fn main() {
    let mut vec = vec![10, 20, 30];
    let i = test(&mut vec);
}

关于rust - 函数,可变借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42681081/

相关文章:

rust - 如何借用一个展开的 Option<T>?

rust - 如何在 Rust 中修复 ".. was mutably borrowed here in the previous iteration of the loop"?

for-loop - 在 Rust 中的 if block 内创建一个向量。 if作用域结束后如何使用?

Rust 嵌入将 GPIO 引脚从输出更改为输入

javascript - 为什么相同的 32 位 float 在 JavaScript 和 Rust 中不同?

rust - crate 是否共享公共(public)依赖项的公共(public)静态变量?

rust - rust 双引用值

rust - 如何在特征中使用枚举并在枚举中的结构上实现特征? rust

rust - 如何编写一个具有返回引用的方法的特征并正确实现它?

rust - 将 Ref 返回到 Rc<RefCell<>> 内部的某些内容,而不使用 Ref::map