2016-05-03 13 views
2

注:エルムを初めて見たのはこれで、先週の事故でその存在について偶然に学んだだけです。Elmのレコードを更新する

レコードを更新するときは、実際にレコードを更新しているか、新しいレコードを作成していますか?

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

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

私が期待する:

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

'法案' で行わ2回の更新があったので。

Elm language siteから読むと、私は破壊的な更新がないことを知っています。新しいオブジェクト(名前が同じ?)が作成され、古い(er)オブジェクトの変更されていないフィールドが共有されます。しかし、これらの例から、「請求書」は全く更新されていないようです。 'bill'がコピーされ、そのコピーが更新され、 'anonymous Will'という新しいレコードが作成されているように見えます。全く新しい記録。

ここで私は何を誤解していますか?

+0

どうやって行ったのですか?理にかなっているのか、まだ明確ではないのか – timothyclifford

答えて

3

あなたはElm REPLで作業しているようですね。最初の更新の出力に何かを割り当てるようには見えません。これは、年齢に応じて2回目の更新を行うときに、Nyeという名前の2番目のオブジェクトではなく、同じ名前の最初のオブジェクトのコピーを作成していることを意味します。

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

あなたが提供したコードサンプルでOKです。あなたはどこにでもアップデートを割り当てません。 '{請求書| age = 22} 'は、更新された年齢22を除き、billと同じプロパティを持つ新しいオブジェクトを作成します。これは変更不可能なため、既存のbillオブジェクトを更新しません。例えば、 'updatedBill = {bill |年齢= 22} ' – timothyclifford

0

新しいレコードを作成しています。

docsあなたが同じくらいの発言を読んでいる:

を言い換えれば、我々は実際に既存のものを上書きするのではなく、新しいレコードを作成する法案のいくつかのフィールドを更新するとき。

これらの例は、Elm REPLの文脈にあります。これらの例では、billに値が1回だけ割り当てられ、変更されません。更新は変数に割り当てられず、結果は画面に出力されます。

Elmファイルでは、更新されたレコードは通常、関数の出力です。 Elm Architectureチュートリアル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 } 
関連する問題