作者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://webptt.com/cn.aspx?n=bbs/Programming/M.1540732576.A.224.html
1F:推 LPH66: xs.slice(1) 是回传「去掉首元素後的阵列」 123.195.192.32 10/28 23:00
2F:→ LPH66: 这个函数在 next 处理时将此所产生的值 123.195.192.32 10/28 23:01
3F:→ LPH66: 设定回次一状态的 moves 成员达成去除目的 123.195.192.32 10/28 23:02
4F:→ art1: 了解,刚刚也才发现自己搞错了 36.237.26.61 10/29 01:19
5F:→ art1: 感谢解答 36.237.26.61 10/29 01:21