什么是单行解决方案来获取切片中除最后一项之外的所有内容而不使用最后一项的索引?

Con*_* Wu 4 arrays slice rust

在 Python 中,我可以这样做:

a = [1,2,3]
b = a[:-1] #1,2
Run Code Online (Sandbox Code Playgroud)

Rust 具有获取数组范围切片的语法,您可以在其中提供最后一个索引,不包含:

let a = vec![1, 2, 3];
let b = &a[0..2]; // [1, 2]
Run Code Online (Sandbox Code Playgroud)

如果我使用-1,它会导致编译器错误:

let a = vec![1, 2, 3];
let b = &a[0..-1];
Run Code Online (Sandbox Code Playgroud)
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`
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

例子 :

我想
在 python 中将"x1::x2::x3::...::xn" 转换为 "x1::x2::x3::...xn-1"单行解决方案应该是

case_1 = "a::b::c";
ret = case1.split("::")[:-1]
Run Code Online (Sandbox Code Playgroud)

但它是铁锈的一条线解决方案

let case_1 =  "a::b::c";
let ret = case_1.split("::").collect::<Vec<_>>() //what could i do next?
Run Code Online (Sandbox Code Playgroud)

zge*_*erd 10

-1只要vec.len()提前添加即可使用:

fn main() {
    let a = vec![1, 2, 3];
    println!("{:?}", &a[0..a.len() - 1]);
}
Run Code Online (Sandbox Code Playgroud)

因为 OP 要求单行,所以您可以删除换行符并使用非惯用的 Rust 格式:

fn main() {
    let a = vec![1, 2, 3]; println!("{:?}", &a[0..a.len() - 1]);
}
Run Code Online (Sandbox Code Playgroud)

  • @CongWu我不明白,“&amp;a[0..a.len() - 1]”**不是**单行解决方案吗? (2认同)

phi*_*mue 8

我认为split_last这就是您要寻找的:它返回一个可选的 2 元组,其中包含对最后一个元素的引用和一个直到(但不包括)最后一个元素的切片。

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

如果你想修改这些值,还有它的表亲split_last_mut