在Python中,我可以做到。
a = [1,2,3]
b = a[:-1] #1,2
Rust有一个语法来获取一个数组的片断 范围 其中你提供了最后的索引,非包含性的。
let a = vec![1, 2, 3];
let b = &a[0..2]; // [1, 2]
如果我用 -1
导致编译器错误。
let a = vec![1, 2, 3];
let b = &a[0..-1];
error[E0277]: the trait bound `usize: std::ops::Neg` is not satisfied
--> src/lib.rs:3:19
|
3 | let b = &a[0..-1];
| ^^ the trait `std::ops::Neg` is not implemented for `usize`
我怎么能这样做呢?
举例来说,我想把 "x1::x2::x3::...:xn "转换成 "x1:::x2:::xn"。
我想在python中把 "x1::x2::x3::...:xn "转换为 "x1::x2::x3:::...xn-1",其中的一行应该为
case_1 = "a::b::c";
ret = case1.split("::")[:-1]
但它的单线防锈解决方案是什么?
let case_1 = "a::b::c";
let ret = case_1.split("::").collect::<Vec<_>>() //what could i do next?
我想 split_last
就是你要找的东西:它返回一个可选的 2-tuple,其中包含对最后一个元素的引用和一个直到(但不包括)最后一个元素的分片。
即 a.split_last().unwrap().1
得到你所要求的东西 (unwrap
假设 a
是非空的)。)
如果你想修改值,还有它的表兄 split_last_mut
.
您可以使用 -1
只要你加上 vec.len()
预先声明。
fn main() {
let a = vec![1, 2, 3];
println!("{:?}", &a[0..a.len() - 1]);
}
因为OP要求的是单行,你可以去掉换行,使用非惯用的Rust格式。
fn main() {
let a = vec![1, 2, 3]; println!("{:?}", &a[0..a.len() - 1]);
}
可能不是你想要的,因为你似乎在寻求一个不那么啰嗦的解决方案, 但你可以使用... pop
; 对于向量,它对原始向量进行突变。
let a = vec![1, 2, 3];
let mut init = a.clone();
&init.pop();
assert_eq!(init, &[1, 2]);