當初看到的貪食蛇專案 https://www.youtube.com/watch?v=bRlvGoWz6Ig
https://github.com/chrokh/fp-games/tree/master/001-snake
最讓我疑惑不解的是關於下次狀態的移動方向程式碼
用來把使用者輸入的方向加入佇列後回傳新狀態的是這段程式碼
const enqueue = (state, move) => validMove(move)(state)
? merge(state)({ moves: state.moves.concat([move]) })
: state
然後取出佇列中的方向的是這一段
const nextMoves = state =>
state.moves.length > 1 ? dropFirst(state.moves) : state.moves
dropFirst 是作者自訂的函式,目的是為了讓取出第一個元素的語義更清楚
const dropFirst = xs => xs.slice(1)
這邊是使用不會改變原陣列的 slice 函式
疑惑的點是,既然不會改變原陣列,那隨著輸入的方向越來越多,豈不是永遠不會減少?
可是看影片沒有這種情況
如果說是因為 nextMoves 這個函式讓每個新狀態的 moves 都只剩一個元素,那又是怎
麼讓 moves 內存有三個以上的方向,且使用者也不再進行輸入(所以不會觸發 enqueue
函式)時,讓 moves 剩下的方向可以保留到下次的新狀態呢?