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

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超越功能块?或者有没有更好的方法只拆分一次字符串?

推荐答案

您正在寻找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 的一个基本方面.如果某样东西需要活一段时间,你就just have to make it exist for that long.在本例中,与链接问题一样,您将返回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)
}

Rust相关问答推荐

if let声明中临时对象的生存期

如何在Rust中获得不可辩驳的'if let'模式警告Mutex锁定?""

为什么我需要在这个代码示例中使用&

返回的future 不是`发送`

如果LET;使用布尔表达式链接(&Q);

通过使用光标拖动角来绕其中心旋转矩形

Pin<;&;mut可能将Uninit<;T>;>;合并为Pin<;&;mut T>;

避免在Collect()上进行涡鱼类型的涂抹,以产生<;Vec<;_>;,_>;

当发送方分配给静态时,Tokio MPSC关闭通道

我们能确定Rust会优化掉Clone()吗?如果它会立即掉落?

无法将 rust 蚀向量附加到另一个向量

习语选项<;T>;到选项<;U>;当T->;U用From定义

如何在 `connect_activate()` 之外创建一个 `glib::MainContext::channel()` 并将其传入?

带引脚和不带引脚的比较功能

结果流到 Vec 的结果:如何避免多个into_iter和collect?

没有明确地说return会产生错误:match arms have incompatible types

从光标位置旋转精灵

如何创建递归borrow 其父/创建者的 struct ?

为实现特征的所有类型实现显示

为什么当borrow 变量发生变化时,borrow 变量不会改变?