rust 为什么我不能在Vec上调用'push'后从Vec中收集字符串< String>?

4sup72z8  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(215)

我正在尝试将字符串的向量收集到分隔符为$的字符串中。

let v = [String::from("bump"), String::from("sage"),String::from("lol"), String::from("   kek   ")]; 
let s: String = v.into_iter().map(|x| x.push_str("$")).collect();
println!("{:?}",s );

上面的代码不起作用,但是:

let v = [String::from("hello"), String::from("world"),String::from("shit"), String::from("   +15   ")]; 
let s: String = v.into_iter().collect();
println!("{:?}",s );

正在工作。如何解决此问题?

qf9go6mv

qf9go6mv1#

您的代码不起作用,因为push_str()返回字符串。
所以你的map()函数从StringMap到(),因为你没有从它返回x
此外,x是不可变的,因此不能在其上调用push_str()。必须声明它为mut
这是您的代码,经过最小程度的修改,it works
第一个
此外,如果您只推送一个字符,请执行push('$')
然而,你会注意到字符串的末尾有一个$,你的用例非常适合reduce(),所以我会用@Aleksander的答案来代替。

hiz5n14c

hiz5n14c2#

你可以使用Iterator::reduce。注意它只会在 * 项之间放置分隔符(而不是像Petterrabit's答案中那样在字符串的末尾),并且它会重用第一个字符串的分配(这会带来稍微更好的内存效率)。

fn main() {
    let v = [
        String::from("bump"),
        String::from("sage"),
        String::from("lol"),
        String::from(" kek "),
    ];
    let s: String = v
        .into_iter()
        .reduce(|mut acc, x| {
            acc.push('$');
            acc.push_str(&x);
            acc
        })
        .unwrap_or_default();
    println!("{}", s);
}
1aaf6o9v

1aaf6o9v3#

必须从Map返回字符串。
请注意,push_str不返回任何内容。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=50534d454a46093299ce38682733c86a

fn main() {
    let v = [
        String::from("bump"),
        String::from("sage"),
        String::from("lol"),
        String::from(" kek "),
    ];
    let s: String = v
        .iter()
        .map(|x| {
            let mut x = x.to_owned();
            x.push_str("$");
            x
        })
        .collect();
    println!("{}", s);
}

编辑
如果您的真实的用例更复杂,并且必须使用迭代器和Map,您应该更喜欢上面的答案,因为这样做更好(不需要拥有从Map返回的字符串,因为无论如何都要将它们收集到一个新的字符串中)。
但也就是说,如果唯一的目的是加入你的Vec与分离器,你应该简单地这样做

fn main() {
    let v = [
        String::from("bump"),
        String::from("sage"),
        String::from("lol"),
        String::from(" kek "),
    ];

    println!("{}", v.join("$"));
}

相关问题