当我们将数组作为参数传递给函数时,为什么数组需要引用,而向量不需要?

问题描述 投票:0回答:1
fn _print_array(arr: &[i32])
{
    println!("Array : {:?}", arr);
}

pub fn print_array()
{
    let _a:[i32;3]=[1,2,3];
    _print_array(&_a);
}

fn _print_vector(v: Vec<i32>)
{
    println!("Vector : {:?}", v);
}

pub fn print_vector()
{
    let _v:Vec<i32> = vec![1, 2, 3];
    _print_vector(_v);
}

当我们将它们作为参数传递给函数时,为什么数组需要引用,而向量不需要?

arrays rust vector borrow-checker
1个回答
0
投票

[i32]
不是一个 array,它是一个 slice。切片没有大小,因此您不能将它们作为函数参数传递。你可以传递数组。

fn print_actual_array<const LEN: usize>(arr: [i32; LEN]) {
    println!("Array : {:?}", arr);
}

您可以使用指针类型传递未确定大小的类型,例如引用 (

&
)、
Box
或原始指针 (
*const
)。
Vec
持有指向切片的
*const
指针。

当你这样做的时候

let _a: [i32; 3] = [1, 2, 3];
_print_array(&_a);

你实际上是在将数组强制转换成一个切片(类似于

Deref
as
),它看起来像这样明确

let _a: [i32; 3] = [1, 2, 3]
let _b: &[i32] = &_a;
_print_array(_b);
© www.soinside.com 2019 - 2024. All rights reserved.