rust 函数从嵌套迭代器中返回

问题描述 投票:0回答:1

我有一个函数可以从 9 x 9 的数字网格创建数独网格。如果发现无效号码,则应返回该号码所在位置的信息(其功能位于注释掉的代码中)。代码当前正在运行,但如果使用注释掉的代码来替换

.unwrap()
,则编译器会吐出一系列错误,这些错误(如果我解释正确)表明
return
正在将值返回到
std::array::from_fn
而不是来自
unsolved_sudoku_from_nums
。我该如何解决这个问题才能按预期工作?谢谢,

/// parse nums into an UnsovedSudoku, 1-9 will be parsed as values 1-9, 0 will be parsed as an unsolved cell and all
///  other values will cause the function to return an InvalidInt error.
fn unsolved_sudoku_from_nums(nums: &[[u8; 9]; 9]) -> Result<UnsolvedSudoku, InvalidInt> {
    Ok(UnsolvedSudoku (
        std::array::from_fn(|i|{
            std::array::from_fn(|j| {
                match nums[i][j] {
                    0 => WorkingCell::PossibleValues([true; 9]),
                    int => WorkingCell::Solved(
                        SudokuValue::from_int(int)
                            .unwrap()
                            // .expect(
                            //     return Err(InvalidInt{
                            //         row: i, 
                            //         column: j, 
                            //         int: nums[i][j],
                            //     })
                            // )
                        ),
                }
            })
        })
    ))
}

仅供参考

struct UnsolvedSudoku (
    [[WorkingCell; 9]; 9]
);
function rust return
1个回答
0
投票

如果数组中的元素类型同时实现

Default
Copy
,您可以编写一个非常简单的
try_from_fn
实现,它几乎没有优化,但不需要不安全的代码:

fn array_try_from_fn<const N: usize, T, E, F>(mut f: F) -> Result<[T; N], E>
where
    T: Default + Copy,
    F: FnMut(usize) -> Result<T, E>,
{
    let mut arr = [T::default(); N];

    for i in 0..N {
        arr[i] = f(i)?;
    }

    Ok(arr)
}
© www.soinside.com 2019 - 2024. All rights reserved.