Elm 如何";生成";在简单应用程序中使用自己的命令
作为elm的学习示例,我想用elm架构创建一个简单的蛇游戏 以下是到目前为止的完整代码: 程序的一部分是一条Elm 如何";生成";在简单应用程序中使用自己的命令,elm,Elm,作为elm的学习示例,我想用elm架构创建一个简单的蛇游戏 以下是到目前为止的完整代码: 程序的一部分是一条UpdateWorld消息,该消息通过点击按钮和UpdateWorld函数生成,当用户按下空格键时调用该函数 这将导致以下编译和工作代码(代码片段构成完整代码): 在这些代码片段中,很明显,onClick事件会生成UpdateWorld命令。 但是在handleInput函数中,我必须“手动”调用updateWorld函数 我宁愿从我的handleInput函数“生成”一个新的Updat
UpdateWorld
消息,该消息通过点击按钮和UpdateWorld
函数生成,当用户按下空格键时调用该函数
这将导致以下编译和工作代码(代码片段构成完整代码):
在这些代码片段中,很明显,onClick
事件会生成UpdateWorld
命令。
但是在handleInput
函数中,我必须“手动”调用updateWorld
函数
我宁愿从我的handleInput
函数“生成”一个新的UpdateWorld
命令。我认为这将澄清代码。比如:
handleInput keyCode =
case Char.fromCode keyCode of
' ' ->
-- how can I generate this command in my code
UpdateWorld
我怎么能这样做
这是一个好主意,还是更好的模式?回想一下,
update
只是一个函数,这意味着您可以递归调用它
考虑更改handleInput
的签名,以同时返回(Model,Cmd Msg)
,就像更新
功能一样:
handleInput:Int->Model->(Model,Cmd-Msg)
HandleInputKeyCode模型=
case Char.fromCode keyCode of
' ' ->
更新World模型
“a”->
{model | snake=changeSnakeDirection model.snake West}![]
...
您可以去掉updateWorld
函数,并将该代码移动到updateWorld
消息处理程序:
update:Msg->Model->(Model,Cmd-Msg)
更新msg模型=
味精案例
更新世界->
({model | snake=updateSnake model.snake},Cmd.none)
更改方向新建方向->
({model | snake=changeSnakeDirection model.snake newDirection},Cmd.none)
按键键代码->
HandleInputKeyCode模型
谢谢,这正好解决了我的问题。我找错角落了,我得把录取标志拿走。在进一步思考这个问题后,我仍然对原来的问题感兴趣……我无意中得到了你的答案:。这似乎和我的问题一样?!是的,正如该答案中所解释的,虽然可以为特定的Msg
触发另一个Cmd
,但您可以/应该坚持递归调用update
,除非您有明确的理由想要经历另一个Elm体系结构事件周期。
handleInput keyCode =
case Char.fromCode keyCode of
' ' ->
-- how can I generate this command in my code
UpdateWorld