我有一個板子,我可以用一個索引glam::IVec2
struct Board{pieces: [char;64]}
type PieceOption = Option<char>;
董事會的這種指數方法是
impl Index<IVec2> for Board {
type Output = PieceOption;
fn index(&self, v : IVec2) -> &Self::Output{
if (v.abs() != v) || (v.max_element() > 8) {&None}
else {
let i : usize = (v.x 8* v.y).try_into().unwrap();
&Some(self.pieces[i])
}
}
}
除了這個 PieceOption 有方法is_empty,is_ally所以is_rival我的問題如下:這個遞回函式的值應該是什么,為了實作型別一致性,我需要函式回傳一個向量,但我不想在這種情況下回傳向量下一塊的顏色相同(is_ally)。除此之外,我想知道是否有一種方法可以解開這些Some值,這樣我就不需要為 match 陳述句中的每個分支鍵入 Some('char'),特別是因為我已經過濾了下一步的情況超出范圍。這是型別不一致的當前函式。這是當前為主教實施的功能,只有我的意圖是為每種運動型別提供此功能常量,例如
const DIAGONALS : [IVec2; 4] = [
ivec2(-1, -1), ivec2(-1, 1),
ivec2(-1, 1), ivec2(1, 1)
];
所以這是函式的當前狀態
impl Board {
fn moves(&self, piece:&PieceOption, pos:IVec2, dir: Vec<IVec2>)->Vec<IVec2>{
dir.into_iter()
.map(|d| d pos)
.filter(|p| (p.abs() == *p) && p.max_element() < 8)
.flat_map(|p|
match piece{
Some('B')|Some('b')=>{
if self[p].is_empty() {self.moves(piece, p, vec![p-pos]).push(p)}
else if self[p].is_rival(*piece) {p}
else {()} /* here is where i do not wish to return a vector because
this is likely a case where the next piece is an opponent*/
},
_ => () /* here is where i do not wish to return a vector because
the piece is likely empty space*/
}
)
.collect()
}
}
更新:我已經意識到更新if let是我需要解開該片段的選項,但我真的很困惑 if let 陳述句的回傳值應該是什么,我當前的函式代碼是
impl Board {
fn moves(&self, piece:&PieceOption, pos:IVec2, dir: Vec<IVec2>)->Option<Vec<IVec2>>{
dir.into_iter()
.map(|d| d pos)
.filter(|p| (p.abs() == *p) && p.max_element() < 8)
.flat_map(|p|
if let Some(c) = piece{
match c{
'B'|'b'=>{
if self[p].is_empty() {self.moves(piece, p, vec![p-pos])?.push(p)}
else if self[p].is_rival(*piece) {Some(vec![p])}
else {None?}
},
_ => None
}
} else {None}
)
.collect()
}
}
除此之外,非常感謝有關格式的任何建議,如果問題措辭令人困惑,我想知道人們對這種潛在解決方案的看法以及我的道歉?完整代碼見: https ://github.com/LyndonAlcock/chess_test
uj5u.com熱心網友回復:
傳遞給的閉包的回傳型別flat_map應該是一個集合。如果你不想添加任何東西,你可以只回傳一個空的。vec![]如果是Vec
也是Option<char>副本,因此您可以只傳遞事物而不是參考。
impl Board {
fn moves(&self, piece: PieceOption, pos: IVec2, dir: Vec<IVec2>) -> Vec<IVec2> {
dir.into_iter()
.map(|d| d pos)
.filter(|p| (p.abs() == *p) && p.max_element() < 8)
.flat_map(|p|
if let Some(c) = piece {
match c {
'B'|'b'=> {
if self[p].is_empty() {
let moves = self.moves(piece, p, vec![p-pos])
moves.push(p);
moves
} else if self[p].is_rival(*piece) {
vec![p]
} else {
vec![]
}
},
_ => vec![]
}
} else {
vec![]
}
)
.collect()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/530714.html
標籤:递归向量锈函数式编程棋
