如何将Vec<Vec<i32>>传递给一个函数?

3

给定一个二维向量,其中包含类型的数据:

let v = vec![
    vec![1, 1, 1], 
    vec![0, 1, 0], 
    vec![0, 1, 0],
];

如何将它传递给函数并最终打印其详情?我尝试了以下代码:
fn printVector(vector: &[[i32]]) {
    println!("Length{}", vector.len())
}

1
请查看此问题 https://dev59.com/VWcs5IYBdhLWcg3wJQi7 - ozkriff
2
惯用的 Rust 编程中,变量、方法、宏和字段使用 snake_case;类型使用 UpperCamelCase;静态变量和常量使用 SCREAMING_SNAKE_CASE。请使用 print_vector - Shepmaster
3
另请参阅应在Rust中使用什么类型来表示二维数组?; 在Rust中创建一个向量的向量; [如何将Vec<Vec <T>> 借用为 &[&[T]]?](https://dev59.com/plUL5IYBdhLWcg3wopMM)。 - Shepmaster
4
你想如何将 v 传递给函数?作为值?作为引用?你需要函数处理 Vec 还是只需要一个 slice 就足够了?参见 *通过引用和 Box 将值传递给函数有什么区别?*。 - Tim Diekmann
3
在评论了语法问题之后,Shepmaster为你做了研究,并向你提供了3个相关的链接。这些人是使StackOverflow值得使用的人。 - mcarton
显示剩余3条评论
4个回答

8
您可以使用一个接受 T 切片的函数,其中 T 也可以被引用为切片:
fn print_vector<T>(value: &[T])
where
    T: AsRef<[i32]>,
{
    for slice in value {
        println!("{:?}", slice.as_ref())
    }
}

游乐场

如果想接受任何类型而不仅仅是i32,可以进行泛化处理:

fn print_vector<T, D>(value: &[T])
where
    T: AsRef<[D]>,
    D: Debug,
{
    for slice in value {
        println!("{:?}", slice.as_ref())
    }
}

在线编程环境


5

由于您将向函数传递向量,因此以下代码应该有效:

fn print_vector(vector: Vec<Vec<i32>>) {
    println!("Length{}", vector.len())
}

3
这是唯一一个接受 Vec 作为参数而不是引用的答案。 - Shepmaster

3
你需要传递一个矢量的切片 - &[Vec<i32>],而不是一个切片的切片:
fn print_vector(vector: &[Vec<i32>]) {
    println!("Length {}", vector.len())
}

fn main() {
    let v = vec![vec![1, 1, 1], vec![0, 1, 0], vec![0, 1, 0]];
    print_vector(&v);
}

Playground


1
fn printVector(vector: &Vec<Vec<i32>>) {
    println!("Length{}", vector.len())
}

let v = vec![
    vec![1, 1, 1],
    vec![0, 1, 0],
    vec![0, 1, 0],
];
printVector(&v);

在这个例子中,&Vec<Vec<i32>>&[Vec<i32>] 没有区别;也许你想改为这样:
fn print_vector(vector: &[Vec<i32>]) {
    for i in vector {
        for j in i {
            println!("{}", j)
        }
    }
}

let v = vec![
    vec![1, 1, 1],
    vec![0, 1, 0],
    vec![0, 1, 0],
];
print_vector(&v);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接