【问题标题】:Updating a record in Elm在 Elm 中更新记录
【发布时间】:2016-05-03 16:31:18
【问题描述】:

注意:这是我第一次看到 Elm,上周我偶然了解到它的存在。

当您更新一条记录时,您是真的在更新一条记录还是只是在创建一条新记录。

> { bill | name = "Nye" }
{ age = 57, name = "Nye" }

> { bill | age = 22 }
{ age = 22, name = "Gates" }

我希望:

> { age = 22, name = "Nye" }

由于对“账单”进行了两次更新。

阅读Elm language site,我知道没有破坏性更新。创建一个新对象(同名?)并共享旧(er)对象未更改的字段。但从这些例子来看,似乎根本没有更新“账单”。看起来更像是正在复制“bill”,正在更新该副本,并且正在创建一个名为“anonymous Will”的新记录。一个全新的记录。

那么我在这里误会了什么?

【问题讨论】:

  • 你过得怎么样?有道理还是不清楚?

标签: elm


【解决方案1】:

您好像在 Elm REPL 中工作?看起来您没有将第一次更新的输出分配给任何东西。这意味着当您对年龄进行第二次更新时,您仍然只是复制第一个具有相同名称的对象,而不是您命名为 Nye 的第二个对象。

-- Create Bill Gates
billGates = { age = 100, name = "gates" }

-- Copy to Bill Nye
billNye = { bill | name = "Nye" }

-- Copy to a younger Bill Nye
youngBillNye = { billNye | age = 22 }

有意义吗?

【讨论】:

  • 没有。我根本没有使用过 REPL。我实际上只是在阅读 OP 中的链接。
  • OK 对于您提供的代码示例,您不会在任何地方分配更新。 { bill | age = 22 } 创建一个新对象,除了更新的年龄为 22 之外,它具有与 bill 相同的属性。它不会更新现有的 bill 对象,因为它是不可变的。如果您想进一步使用日期,则需要分配此日期,例如 updatedBill = { bill | age = 22 }
【解决方案2】:

您正在创建新记录。

您正在阅读的docs 说了这么多:

换句话说,当我们更新账单的某些字段时,我们实际上创建了一条新记录,而不是覆盖现有记录。

他们给出的例子是在 Elm REPL 的上下文中。在这些示例中,bill 仅分配了一次值并且不会更改。更新不会分配给变量,而是将结果打印到屏幕上。

在 Elm 文件中,更新的记录通常是函数的输出。 Elm 架构教程Example 2 中的update 函数很好地证明了这一点。我已经简化了下面的函数(以模块化和可扩展性为代价)。

type alias Model =
  { topCounter : Int
  , bottomCounter : Int
  }

type Action
  = Reset
  | IncTop
  | DecTop
  | IncBottom
  | DecBottom

update : Action -> Model -> Model
update action model =
  case action of
Reset ->
  Model 0 0
IncTop ->
  { model | topCounter = model.topCounter + 1 }
DecTop ->
  { model | topCounter = model.topCounter - 1 }
IncBottom ->
  { model | bottomCounter = model.bottomCounter + 1 }
DecBottom ->
  { model | bottomCounter = model.bottomCounter - 1 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多