有什么单行方案可以在不使用最后一项索引的情况下,获得分片中除了最后一项以外的所有内容?

问题描述 投票:-1回答:3

在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?
arrays rust slice
3个回答
6
投票

我想 split_last 就是你要找的东西:它返回一个可选的 2-tuple,其中包含对最后一个元素的引用和一个直到(但不包括)最后一个元素的分片。

a.split_last().unwrap().1 得到你所要求的东西 (unwrap 假设 a 是非空的)。)

如果你想修改值,还有它的表兄 split_last_mut.


1
投票

您可以使用 -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]);
}

-2
投票

可能不是你想要的,因为你似乎在寻求一个不那么啰嗦的解决方案, 但你可以使用... pop; 对于向量,它对原始向量进行突变。

let a = vec![1, 2, 3];
let mut init = a.clone();
&init.pop();
assert_eq!(init, &[1, 2]);
© www.soinside.com 2019 - 2024. All rights reserved.