我想学Rust .我最近遇到的一个问题是:

我遇到的问题是,chars()方法返回Chars struct ,由于某种原因,它没有实现SliceConcatExt特性,因此无法对其调用chunks().

此外,一旦我成功地创建了Chunks struct (改为调用.bytes()),我不确定如何调用.join(' '),因为元素现在是字节片的Chunks...

必须有一种优雅的方式来做到这一点,我错过了.

例如,这里有一个输入/输出说明了这种情况:

given: whatupmyname, 4
output: what upmy name

这是我拙劣的try :

let n = 4;
let text = "whatupmyname".into_string();
text.chars()
    // compiler error on chunks() call
    .chunks(n)
    .collect::<Vec<String>>()
    .join(' ')

谢谢你的帮助!

推荐答案

这里的问题是chars()bytes()返回Iterator秒,而不是切片.你可以用as_bytes(),也就是&[u8].然而,你不能直接从&str中得到&[char],因为只有字节本身存在,而char必须通过查看每个字节组成了多少字节来创建.你必须这样做:

text.chars()
    .collect::<Vec<char>>()
    .chunks(n)
    .map(|c| c.iter().collect::<String>())
    .collect::<Vec<String>>()
    .join(" ");

然而,我不建议这样做,因为它必须为Vec秒和String秒分配大量临时存储空间.相反,你可以做这样的事情,只需要分配来创建最终的String.

text.chars()
    .enumerate()
    .flat_map(|(i, c)| {
        if i != 0 && i % n == 0 {
            Some(' ')
        } else {
            None
        }
        .into_iter()
        .chain(std::iter::once(c))
    })
    .collect::<String>()

在最后一次收集之前,它一直作为迭代器,使用一个迭代器进行平面_映射,迭代器要么是字符,要么是空格,然后是字符.

Rust相关问答推荐

在‘await’点上使用‘std::同步::Mutex’是否总是会导致僵局?

如何优化小型固定大小数组中的搜索?

常量泛型和类型枚举箱有重叠的用途吗?

使用Clap时如何将String作为Into Str参数传递?

什么时候和为什么S最好是按值或引用传递简单类型

为什么这个变量不需要是可变的?

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

如果变量本身不是None,如何返回;如果没有,则返回None&Quot;?

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

如何从trait方法返回std :: iter :: Map?

为什么需要同时为值和引用实现`From`?方法不应该自动解引用或borrow 吗?(2023-06-16)

Rust 打包在 .deb 中

使用 lalrpop 在 rust 中解析由 " 引用的字符串

在线程中运行时,TCPListener(服务器)在 ip 列表中的服务器实例之前没有从客户端接受所有客户端的请求

&str 的编译时拆分是否可能?

为什么1..=100返回一个范围而不是一个整数?

无法把握借来的价值不够长寿,请解释

实现不消费的迭代器

带有库+多个二进制文件的Cargo 项目,二进制文件由多个文件组成?

相互调用的递归异步函数:检测到循环