注意:这是我第一次看到榆树,上周我偶然了解了它的存在。
更新记录时,您是真正更新记录还是仅创建新记录。
> { 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'的新记录。一个全新的记录。
那么我在这里误解了什么?
答案 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 }