我在哪里存储内部状态?

时间:2016-10-16 11:38:11

标签: elm

我有一条记录,其中两个字段在初始化时应该是0,并且只能由内部函数更新。

我怎样才能做到这一点?我在哪里保持内部状态?要求用户请提供0作为参数而不是触及这些字段?

1 个答案:

答案 0 :(得分:2)

您可以使用模块上的exposing关键字限制模块公开的类型和功能。但是,您无法隐藏记录类型的各个字段。让我们首先定义您想要保密的记录别名:

type alias InternalModel =
    { foo : Int
    , bar : Int
    }

首先,我们需要一种方法来隐藏值的内部。这通常通过暴露类型但没有构造函数来完成。

module MyModule exposing (Model)

type Model = Model InternalModel

以上代码根本不允许外部模块查看InternalModel类型参数或与之交互。您甚至无法在此模块之外创建Model。这是我们可以定义一个创建新Model的函数并将这些初始值设置为零的地方。您还必须调整模块exposing列表(此处我将创建外部模块设置bar,同时将foo默认为零):

module MyModule exposing (Model, newModel)

newModel : Int -> Model
newModel bar =
    Model { foo = 0, bar = bar }

如果你想为字段公开“getters”和“setter”,你可以这样做:

module MyModule exposing (Model, newModel, getFoo, setFoo)

getFoo : Model -> Int
getFoo (Model {foo}) =
    foo

setFoo : Int -> Model -> Model
setFoo foo (Model model) =
    Model { model | foo = foo }
相关问题