功能,可变借用

时间:2017-03-08 20:14:20

标签: 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);    
  |     ^^^^^^^^^^^^

=更改为::无济于事,我不明白为什么会这样做。

1 个答案:

答案 0 :(得分:0)

您不应使用<>包装所有类型。 <>表示您要指定通用参数。这就足够了:

let i: i32 = /* value */;

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

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

let i = test(&mut vec);

这可以解决你的第二个问题。

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

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

  • .允许您访问结构字段(以及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);
}