3

「関数型プログラミング」スタイルでコードを書きたいと思います。

Okただし、結果の反復子から始めて、関数をアイテムに適用したいだけです。さらに、最初のエラーで反復を停止したいと考えています (ただし、別の動作を受け入れることもできます)。

これまでのところ、ネストされたmap()パターンを使用しています: <iter>.map(|l| l.map(replace)). これは非常にまずいと思います。

毎晩の「result_flattening」を使用して、ネストさResult<Result<T, E>, E>れたそれぞれをResult<T, E>. を使用しeyre::Contextて、さまざまなエラー タイプをエラー タイプに変換しeyre::Reportます。これはすべて非常に不器用に感じます。

これをRustで書くエレガントな方法は何ですか?

最小限の作業例

#![feature(result_flattening)]
use std::io::BufRead;

use eyre::Context;

fn main() {
    let data = std::io::Cursor::new(b"FFBFFFBLLL\nBFBFBBFRLR\nFFFBFFBLLL");

    let seats: Result<Vec<_>, _> = data
        .lines()
        .map(|l| l.map(replace).context("force eyre"))
        .map(|l| l.map(|s| u32::from_str_radix(&s, 2).context("force eyre")))
        .map(|r| r.flatten())
        .collect();

    println!("{:#?}", seats);
}

fn replace(line: String) -> String {
    line.replace('F', "0")
        .replace('B', "1")
        .replace('L', "0")
        .replace('R', "1")
}

さらなる参考文献:

4

1 に答える 1