以下代码运行:
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
可能比尝试编写一个执行相同操作的函数更令人头疼,但是就理解函数如何接受其中包含字符串的数组而言,为什么第二个示例无法编译?
[&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)