在 Rust 中仅拆分字符串一次

16

我想通过分隔符将字符串分割一次,然后放入元组中。我尝试过以下方法:

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)
}

但我一直被告知second的生命不够长。我猜这是因为splitter只存在于函数块内部,但我不确定如何解决这个问题。如何强制让second在函数块之外存在?或者有更好的方法只分割一次字符串吗?

2个回答

23
你正在寻找 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)
}

请注意,Rust使用snake_case命名规则。


不是因为splitter仅存在于函数块中,而是因为你创建了一个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)
}

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")));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接