web-dev-qa-db-ja.com

スペースを挿入するためにRustのチャンクに文字列を分割する方法

私は錆を学びようとしています。そして、私が遭遇した最近の問題は次のとおりです。String、つまりnの倍数は、文字列をサイズNのチャンクに分割し、これらのチャンクの間にスペースを挿入してから、単一の文字列.

IUS INSION IUS IUSTでは、chars()メソッドがChars structを返します。これは何らかの理由でSliceConcatExt形式を実装していないため、chunks()を呼び出すことはできません。

さらに、(代わりに.bytes()を呼び出すことによって)チャンク構造体を正常に作成したら、要素がバイトスライスのChunksの場合、.join(' ')を呼び出す方法はわかりません...

これを行うためのエレガントな方法がある必要があります。

たとえば、ここでは状況を示す入力/出力です。

_given: whatupmyname, 4
output: what upmy name
_

これは私の不十分な試みです。

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

ご協力ありがとうございました!

8
Zeke

そのため、文字列を作成するために文字のリストから作業したい場合は、それに対して 折りたたみ を使用できます。

このようなもの :

text.chars
    .enumerate()
    .fold(String::new(), |acc, (i, c)| {
        if i != 0 && i == n {
            format!("{} {}", acc, c)
        } else {
            format!("{}{}", acc, c)
        }
    })
 _
3
sterfield

分割したいデータのサイズが修正された場合

use std::str;

fn main() {
    let subs = "&#8204;&#8203;&#8204;&#8203;&#8204;&#8203;&#8203;&#8204;&#8203;&#8204;".as_bytes()
        .chunks(7)
        .map(str::from_utf8)
        .collect::<Result<Vec<&str>, _>>()
        .unwrap();
        
    println!("{:?}", subs);
}

// >> ["&#8204;", "&#8203;", "&#8204;", "&#8203;", "&#8204;", "&#8203;", "&#8203;", "&#8204;", "&#8203;", "&#8204;"]
 _
0
Esteban Borai