string - 如何从 Rust 中的字符串开头删除 "crop"个字符?

标签 string rust

我想要一个函数,它可以接受两个参数 (string, number of letters to crop off front) 并返回相同的字符串,除了字符 x 之前的字母不见了.

如果我写

let mut example = "stringofletters";
CropLetters(example, 3);
println!("{}", example);

那么输出应该是:

ingofletters

有什么办法可以做到这一点吗?

最佳答案

在许多用途中,简单地返回输入的一部分是有意义的,避免任何复制。转换 @Shepmaster's solution使用不可变切片:

fn crop_letters(s: &str, pos: usize) -> &str {
    match s.char_indices().skip(pos).next() {
        Some((pos, _)) => &s[pos..],
        None => "",
    }
}

fn main() {
    let example = "stringofletters"; // works with a String if you take a reference
    let cropped = crop_letters(example, 3);
    println!("{}", cropped);
}

相对于变异版本的优势是:

  • 不需要副本。如果你想要一个新分配的结果,你可以调用 cropped.to_string();但你不必这样做。
  • 它适用于静态字符串切片以及可变 String 等。

缺点是,如果您确实有一个要修改的可变字符串,那么效率会稍微低一些,因为您需要分配一个新的 String

关于string - 如何从 Rust 中的字符串开头删除 "crop"个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447780/

相关文章:

multithreading - 什么时候或为什么我应该使用 Mutex 而不是 RwLock?

php - 为什么在以下情况下 echo 后没有插入换行符?

c++ - 为什么这段将字符串初始化为单个字符的代码会调用 initializer_list 构造函数?

error-handling - 如何跟踪错误结果的原因?

rust - 如何处理unwrap_or_else中的异常(Err)?

c++ - 等效于 Rust 的 include_str 的 C++ 宏

llvm - `LLVM ERROR: Target does not support MC emission!` 的原因是什么?

java - 有人可以用 java 解释这段代码的答案吗?

string - 将文件按行然后按单词分割时,为什么会得到一个空向量?

java:字符串索引超出范围:6