作者art1 (人,原來不是人)
看板Programming
標題[問題] javascript 函數式寫法的狀態傳遞
時間Sun Oct 28 21:16:10 2018
當初看到的貪食蛇專案
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 剩下的方向可以保留到下次的新狀態呢?
--
「看在上帝的份上,我們不能當著孩子的面槍殺他的父親!」
「那我們就連孩子一起幹掉!」
「第一槍打中的是那個天真的孩子,第二槍是抱著孩子的母親。第三槍
停頓了三秒,當難以致信的父親擦拭著臉上愛子的腦漿從震驚中醒轉
過來,慢慢的轉頭看向停車的地方,分辨出是誰在攻擊他後,第三顆
子彈才將他的腦殼打飛。」 ─摘自〈狼群〉
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.237.26.61
※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1540732576.A.224.html
推 LPH66: xs.slice(1) 是回傳「去掉首元素後的陣列」 123.195.192.32 10/28 23:00
→ LPH66: 這個函數在 next 處理時將此所產生的值 123.195.192.32 10/28 23:01
→ LPH66: 設定回次一狀態的 moves 成員達成去除目的 123.195.192.32 10/28 23:02
→ art1: 了解,剛剛也才發現自己搞錯了 36.237.26.61 10/29 01:19
→ art1: 感謝解答 36.237.26.61 10/29 01:21