我在 Elm 中使用“撰写”模式。
在 中Main.elm
,我正在生成用于Random
使用以下内容的初始种子:
type alias Model =
{ ...
, seed : Seed
}
initialModel : Model
initialModel =
{ ...
, seed = initialSeed 0
}
init : ( Model, Cmd Msg )
init =
( initialModel, generate InitializeSeed (int minInt maxInt) )
type Msg
= ...
| InitializeSeed Int
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
...
InitializeSeed value ->
( { model | seed = Random.initialSeed value }, Cmd.none )
这似乎适用于将随机数生成器种子初始化为随机起始值。
我有一个在主应用程序中使用的“独立”小部件。我想在收到InitializeSeed
消息时将种子传递给该小部件,然后在它在子小部件中发生变化时检索该值(使用Random.step
),以便我可以在其他小部件需要生成器时更新它们的种子。
如何从update
函数中为子小部件生成消息,Main
以便我可以将种子传递给孩子?孩子如何将更新后的种子返回给父母?
更新:
我想出了如何将种子传递给子小部件的方法,尽管我不确定这是最好的方法。
子代码如下所示:
type alias Model =
{ ...
, seed : Seed
}
replaceSeed : Model -> Seed -> Model
replaceSeed model seed =
{ model | seed = seed }
在父级中,我修改了update
这样的函数:
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
...
InitializeSeed value ->
let
seed =
Random.initialSeed value
child_ =
Child.replaceSeed model.child seed
in
( { model
| seed = seed
, child = child_
}
, Cmd.none
)
我仍在寻找一种方法让孩子返回更新后的种子。
而任何 Elm 程序中的顶级更新函数都必须是
update : Msg -> Model -> (Model, Cmd Msg)
它的任何后代的形状都没有限制。所以没有什么能阻止你为你的孩子定义
update : Seed -> Msg -> Model -> (Model, Cmd Msg, Seed)
或者,如果孩子从不返回任何命令
update : Seed -> Msg -> Model -> (Model, Seed)
也许您有几件事情要传递,例如包括父信息。然后你可以走得更远
type alias Config msg =
{ seed : Seed
, someParentMessage : String -> msg
}
update : Config msg -> Msg -> Model -> (Model, Maybe (Cmd msg), Seed)
当然,您需要在 Main 中适当地连接所有这些,但编译器会对此提供帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句