更新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" }

由于'bill'已经完成了两次更新。

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

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

2 个答案:

答案 0 :(得分:3)

看起来你在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 }

有意义吗?

答案 1 :(得分:0)

您正在创建新记录。

您正在阅读的docs同样说:

  

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

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

在Elm文件中,更新的记录通常是函数的输出。 Elm Architecture Tutorial 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 }