将字符串数组传递给函数而无需指定 N(编译时常量)

Ube*_*per 2 arrays rust

以下代码运行:

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

fn main() {
    let names = ["this", "that"];
    println!("{}", names[last_el(names)]);
}
Run Code Online (Sandbox Code Playgroud)

然而,它只这样做,[&str; 2]并且 2 必须匹配names. 例如,以下代码无法编译:

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

fn main(){
    let names = ["this","that"];
    println!("{}", names[last_el(names)]); 
}
Run Code Online (Sandbox Code Playgroud)

我将如何写这个以便我不必指定N

我知道这arr.len() - 1可能比尝试编写一个执行相同操作的函数更令人头疼,但是就理解函数如何接受其中包含字符串的数组而言,为什么第二个示例无法编译?

Fra*_*gné 7

[&str]是无尺寸类型。您不能直接操作 unsized 类型的值,它们需要在指针后面。在您的情况下,您应该使用&[&str](也称为slice)。

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

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

我还会注意到last()在切片上定义了一个方法。它将像这样使用:

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