我有一个函数可以从 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]
);
如果数组中的元素类型同时实现
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)
}