2016-05-03 80 views
2

注意:這是我第一次見到榆樹,上週我剛剛意外地瞭解了它的存在。更新Elm中的記錄

當你更新記錄時,你真的在​​更新記錄還是隻是創建一個新記錄?

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

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

我希望:

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

因爲有對 '法案' 進行兩次更新。

Elm language site閱讀,我知道有沒有破壞性的更新。一個新的對象(具有相同的名稱?)被創建並共享舊(er)對象未被更改的字段。但從這些例子來看,它似乎並沒有像「賬單」一樣被更新。看起來更像是「賬單」正在被複制,正在更新副本,並且正在創建名爲「匿名意願」的新記錄。一個全新的記錄。

那麼我在這裏誤解了什麼?

+0

你是怎麼去的?有意義還是不清楚? – timothyclifford

回答

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 } 

有意義嗎?

+0

不,我根本沒有使用過REPL。我從字面上只是從OP中的鏈接中讀取。 –

+0

對於您提供的代碼示例,確定您沒有在任何地方分配更新。 '{bill | age = 22}'創建一個新的對象,除了22的更新年齡之外,它具有與bill相同的屬性。它不更新現有的bill對象,因爲它是不可變的。如果您想要進一步處理日期,則需要指定此名稱,例如'updatedBill = {bill |年齡= 22}' – timothyclifford

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 }