[問題] javascript 函數式寫法的狀態傳遞

看板Programming作者 (人,原來不是人)時間6年前 (2018/10/28 21:16), 編輯推噓1(104)
留言5則, 2人參與, 6年前最新討論串1/1
當初看到的貪食蛇專案 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

10/28 23:00, 6年前 , 1F
xs.slice(1) 是回傳「去掉首元素後的陣列」
10/28 23:00, 1F

10/28 23:01, 6年前 , 2F
這個函數在 next 處理時將此所產生的值
10/28 23:01, 2F

10/28 23:02, 6年前 , 3F
設定回次一狀態的 moves 成員達成去除目的
10/28 23:02, 3F

10/29 01:19, 6年前 , 4F
了解,剛剛也才發現自己搞錯了
10/29 01:19, 4F

10/29 01:21, 6年前 , 5F
感謝解答
10/29 01:21, 5F
文章代碼(AID): #1RrRQW8a (Programming)
文章代碼(AID): #1RrRQW8a (Programming)