rust 将字符串数组传递给函数,而不必指定N(编译时常量)

9nvpjoqh  于 2023-02-19  发布在  其他
关注(0)|答案(2)|浏览(100)

将运行以下代码:

fn last_el(arr: [&str; 2]) -> usize {
    arr.len() - 1
}

fn main() {
    let names = ["this", "that"];
    println!("{}", names[last_el(names)]);
}

但是,它只对[&str; 2]执行此操作,并且2必须与names中的元素数匹配。例如,以下代码无法编译:

fn last_el(arr: [&str]) -> usize {
    arr.len() - 1
}

fn main(){
    let names = ["this","that"];
    println!("{}", names[last_el(names)]); 
}

我该怎么写才能不用指定N呢?
我知道arr.len() - 1可能比试图编写一个做同样事情的函数更令人头痛,但是就理解函数如何接受其中包含字符串的数组而言,为什么第二个示例编译失败?

ukxgm1gy

ukxgm1gy1#

[&str]是一个unsized类型。你不能直接操作unsized类型的值,它们需要在一个引用或指针之后。在你的情况下,你应该使用&[&str](也称为一个 slice)。

fn last_el(arr: &[&str]) -> usize {
    arr.len() - 1
}

fn main() {
    let names = ["this", "that"];
    println!("{}", names[last_el(&names)]);
}

我还要注意到,在切片上定义了一个last()方法,它的用法如下:

fn main() {
    let names = ["this", "that"];
    println!("{}", names.last().unwrap()); 
}

相关问题