我想只用分隔符将字符串拆分一次并将其放入元组中。我试着做了
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
强制转换为功能块之外的现有内容?或者是否有更好的方法只将字符串拆分一次?
答案 0 :(得分:6)
您正在寻找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
。
我想这是因为分割器只存在于功能块
中
不,这是因为您已经创建了String
,并且正在尝试返回对它的引用; you cannot do that。 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)
}