String 有没有一种方法可以在不分配另一个字符串的情况下修剪字符串?

String 有没有一种方法可以在不分配另一个字符串的情况下修剪字符串?,string,rust,trim,String,Rust,Trim,我有一个CSV格式的文件,第一列数据表示可选以“UNIUNI”结尾的项目代码,或这些字符的混合大小写,通过条形码阅读器加载。我需要修剪掉最后一个“UNI”s 我写了这个函数: fn main() { // Ok: from "9846UNIUNI" to "9846" println!("{}", read_csv_rilev("9846UNIUNI".to_string()));

我有一个CSV格式的文件,第一列数据表示可选以
“UNIUNI”
结尾的项目代码,或这些字符的混合大小写,通过条形码阅读器加载。我需要修剪掉最后一个
“UNI”
s

我写了这个函数:

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)
但对
字符串执行就地操作可能不是一个好主意。事实上,在Rust标准库中,除了
String::pop()
之外,没有其他方法可以做到这一点

但对字符串执行就地操作可能不是一个好主意

绑定在
mut s:&String
中是可变的,而不是字符串本身。如果要对字符串本身进行变异,可以使用
s:&mut String

也就是说,我认为标准库中没有任何东西可以做到这一点

有没有办法在不分配另一个字符串的情况下修剪
字符串

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

const拖车:&'static str=“UNI”;
fn读取\u csv\u rilev(s:&mut字符串){
而s.以(拖车)结尾{
设len=s.len();
让new_len=len.saturating_sub(trail.len());
s、 截断(新的);
}
}
fn main(){
让mut code=“Hello worlduni.into();
读取csv rilev(&mut代码);
assert_eq!(“你好,世界”,代码);
}
您根本不需要处理分配的字符串。您可以使用相同的逻辑并生成字符串的连续子片段。这基本上就是
trim\u right\u matches
的工作原理,但不太通用:

const拖车:&'static str=“UNI”;
fn read_csv_rilev(mut s:&str)->&str{
而s.以(拖车)结尾{
设len=s.len();
让new_len=len.saturating_sub(trail.len());
s=&s[…新的];
}
s
}
fn main(){
让code=“你好,世界统一”;
让截断=读取(代码);
assert_eq!(“Hello World”,截断);
}

一般来说,我可能会选择第二种解决方案。

另一种解决方案是使用板条箱,它允许您同时返回
&str
及其支持
字符串

extern crate owning_ref;
use owning_ref::StringRef;

fn read_csv_rilev(code: String) -> StringRef {
    StringRef::new(code).map(|s| s.trim_right_matches("UNI"))
}

谢谢你,史蒂夫。你说得对。有时键盘上的手连接不太好…:-)
.trim\u right\u matches()
将在Rust 1.2和
中保持稳定。trim\u right()
,您可以使用它来执行此操作,而无需
。to\u string()
。只需使用修剪的str的长度进行截断即可。