我有一个CSV格式的文件,第一列数据表示项目代码,可选以"UNIUNI"个字符或混合字符结尾,通过条形码阅读器加载.我需要删掉最后的"UNI".

我写了这个函数:

fn main() {
    // Ok: from "9846UNIUNI" to "9846"
    println!("{}", read_csv_rilev("9846UNIUNI".to_string()));
    
    // Wrong: from "9846uniuni" to "9846"
    println!("{}", read_csv_rilev("9846uniuni".to_string()));
}

fn read_csv_rilev(code: String) -> String {
    code
        //.to_uppercase() /*Unstable feature in Rust 1.1*/
        .trim_right_matches("UNI")
        .to_string()
}

理想的函数签名如下所示:

fn read_csv_rilev(mut s: &String)

但对String人采取就地行动可能不是一个好主意.事实上,在Rust标准库中,除了String::pop()之外,没有任何东西可以这样做.

推荐答案

有没有办法在不分配另一个的情况下削减一个String

是的,可以使用truncate删除字符串的尾部:

const TRAILER: &'static str = "UNI";

fn read_csv_rilev(s: &mut String) {
    while s.ends_with(TRAILER) {
        let len = s.len();
        let new_len = len.saturating_sub(TRAILER.len());
        s.truncate(new_len);
    }
}

fn main() {
    let mut code = "Hello WorldUNIUNIUNI".into();
    
    read_csv_rilev(&mut code);
    
    assert_eq!("Hello World", code);
}

您根本不需要弄乱分配的字符串.您可以使用相同的逻辑,对字符串进行连续的子切片.这基本上就是trim_right_matches的工作原理,但有点不那么通用:

const TRAILER: &'static str = "UNI";

fn read_csv_rilev(mut s: &str) -> &str {
    while s.ends_with(TRAILER) {
        let len = s.len();
        let new_len = len.saturating_sub(TRAILER.len());
        s = &s[..new_len];
    }
    s
}

fn main() {
    let code = "Hello WorldUNIUNIUNI";

    let truncated = read_csv_rilev(code);

    assert_eq!("Hello World", truncated);
}

一般来说,我可能会 Select 第二种解决方案.

Rust相关问答推荐

Rust,polars CSV:有没有一种方法可以从impll BufRead(或任何字节迭代器)中读取CSV?

Rust:跨多个线程使用hashmap Arc和rwlock

什么时候和为什么S最好是按值或引用传递简单类型

如何go 除多余的(0..)在迭代中,当它不被使用时?

了解Rust';s特征对象和不同函数签名中的生存期注释

Cargo.toml:如何有条件地启用依赖项功能?

try 实现线程安全的缓存

在 Rust 中,是否可以定义一个需要实现类型的构造函数的对象安全特征?

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

Rust中的一生语法有什么作用?

使用 lalrpop 在 rust 中解析由 " 引用的字符串

判断对象是 PyDatetime 还是 Pydate 的实例?

如何在 Rust Polars 中可靠地连接 LazyFrames

如何在 Rust 中返回通用 struct

我如何将特征作为 struct 的拥有字段?

C++ 中的 CRTP 是一种表达其他语言中特征和/或 ADT 的方法吗?

返回 &str 但不是 String 时,borrow 时间比预期长

在 macro_rules 中转义 $ 美元符号

如何阅读 HttpRequest 主体

为什么一个整型变量赋值给另一个变量后仍然可以使用?