在Rust中只拆分一次字符串

时间:2017-01-07 02:26:50

标签: 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)
}

但我不断被告知second活不了多久。我想这是因为splitter只存在于功能块中,但我不确定如何解决这个问题。如何将second强制转换为功能块之外的现有内容?或者是否有更好的方法只将字符串拆分一次?

1 个答案:

答案 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 thatsecond是不能长寿的。

  

如何将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)
}