在Rust中只拆分一次字符串

erp*_*erp 4 rust

我想只用分隔符将字符串拆分一次并将其放入元组中.我试过了

fn splitOnce(in_string: &str) -> (&str, &str) {
    let mut splitter = in_string.split(':');
    let first = splitter.next().unwrap();
    let second = splitter.fold("".to_string(), |a, b| a + b); 
    (first, &second)
}
Run Code Online (Sandbox Code Playgroud)

但我一直被告知,second活得不够久.我想这是因为splitter它只存在于功能块内部,但我不确定如何解决这个问题.如何强制second进入功能块之外的现有?或者是否有更好的方法只分裂一次字符串?

Car*_*lsh 10

str::split_once现在是内置的。

文档示例:

assert_eq!("cfg".split_once('='), None);
assert_eq!("cfg=".split_once('='), Some(("cfg", "")));
assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
Run Code Online (Sandbox Code Playgroud)


She*_*ter 7

您正在寻找str::splitn:

fn split_once(in_string: &str) -> (&str, &str) {
    let mut splitter = in_string.splitn(2, ':');
    let first = splitter.next().unwrap();
    let second = splitter.next().unwrap();
    (first, second)
}

fn main() {
    let (a, b) = split_once("hello:world:earth");
    println!("{} --- {}", a, b)
}
Run Code Online (Sandbox Code Playgroud)

请注意Rust使用snake_case.


我想这是因为分割器只存在于功能块内部

不,这是因为你创建了一个String并试图返回它的引用; 你不能这样做.second是不够长寿的东西.

如何强制second进入功能块之外的现有?

你没有.这是Rust的一个基本方面.如果某些东西需要活一段时间,你只需要让它存在那么长时间.在这种情况下,如在链接问题中,您将返回String:

fn split_once(in_string: &str) -> (&str, String) {
    let mut splitter = in_string.split(':');
    let first = splitter.next().unwrap();
    let second = splitter.fold("".to_string(), |a, b| a + b); 
    (first, second)
}
Run Code Online (Sandbox Code Playgroud)