2016-05-03 3 views
2

HINWEIS: Dies ist das erste Mal, dass ich Elm betrachte und ich habe zufällig letzte Woche von seiner Existenz erfahren.Einen Eintrag in Elm aktualisieren

Wenn Sie einen Datensatz aktualisieren, aktualisieren Sie einen Datensatz oder erstellen einen neuen Datensatz.

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

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

würde ich erwarten:

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

Da auf 'Rechnung' gibt es zwei getan Updates.

Lesen von der Elm language site, ich weiß, dass es keine destruktiven Updates gibt. Ein neues Objekt (mit dem gleichen Namen?) Wird erstellt und teilt die Felder, die nicht vom alten Objekt geändert wurden. Aber von diesen Beispielen scheint es nicht so, als würde 'Rechnung' überhaupt aktualisiert werden. Es sieht eher so aus, als würde 'Rechnung' kopiert, die Kopie wird aktualisiert und ein neuer Datensatz namens 'anonymous Will' wird erstellt. Ein völlig neuer Rekord.

Also, was versteh ich hier falsch?

+0

Wie sind Sie gegangen? Sinn machen oder noch nicht klar? – timothyclifford

Antwort

3

Es sieht so aus, als ob Sie in der Elm REPL arbeiten? Es sieht nicht so aus, als würden Sie die Ausgabe Ihres ersten Updates einem beliebigen Objekt zuweisen. Das bedeutet, dass Sie, wenn Sie Ihr zweites Update für das Alter durchführen, nur eine Kopie des ersten Objekts erstellen, das den gleichen Namen hat, und nicht das zweite Objekt, das Sie Nye nennen.

-- 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 } 

Sinn machen?

+0

Nein. Ich habe die REPL überhaupt nicht benutzt. Ich lese gerade von dem Link im OP. –

+0

OK für das von Ihnen bereitgestellte Codebeispiel, Sie weisen Ihre Aktualisierungen nirgends zu. '{Rechnung | age = 22} 'erstellt ein neues Objekt mit den gleichen Eigenschaften wie die Rechnung außer einem aktualisierten Alter von 22. Es aktualisiert das vorhandene Rechnungsobjekt nicht, da dies unveränderlich ist. Sie müssen dies zuweisen, wenn Sie mit dem Datum weiter arbeiten möchten, zB 'updatedBill = {bill | Alter = 22} ' – timothyclifford

0

Sie erstellen einen neuen Datensatz.

Mit anderen Worten, wenn wir einige Felder der Rechnung aktualisieren tatsächlich schaffen wir einen neuen Datensatz, anstatt die bestehende zu überschreiben: nur so viel

Die docs Sie sagen zu lesen.

Die Beispiele, die sie geben, sind im Zusammenhang mit der Elm REPL. In diesen Beispielen wird bill nur einmal zugewiesen und ändert sich nicht. Die Aktualisierungen werden nicht Variablen zugewiesen und die Ergebnisse werden auf dem Bildschirm gedruckt.

In einer Elm-Datei sind aktualisierte Datensätze normalerweise die Ausgabe von Funktionen. Die update Funktion in Elm Architecture Tutorial Example 2 zeigt dies gut. Ich habe die Funktion unten vereinfacht (auf Kosten von Modularität und Skalierbarkeit).

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 }