2016-04-03 43 views

回答

10

請不是(:=)Json.Decode0.18.0

綴運算符

在榆樹開始刪除,你可以自定義infix operators,他們存在的目的是爲了提供代碼的可讀性更強的版本。具有諷刺意味的是,當你對這個概念不熟悉時,情況恰恰相反。

(:=)是一個自定義中綴運算符,由Json.Decode包提供。

請考慮自定義管道符的下面的例子:

import Html exposing (text) 

(<|>) : String -> String -> String 
(<|>) beginning end = 
    beginning ++ "Bar" ++ end 

main = 
    text ("Foo" <|> "Buz") -- "FooBarBuz" 

強烈建議,以避免定製中綴運算符的使用。

讓我們回到(:=)運營商。

類型定義爲它看起來像(:=) : String -> Decoder a -> Decoder a,這意味着,我們必須通過一個String和解碼器,從可用Decoder Primitives列表並重新運行新的解碼器,映射到一個字符串鍵。

本機代碼

在JavaScript的世界裏,解碼器是做類型檢查的回調函數。

例如,這裏是一個解碼器字符串基元:

function decodeString(value) { 
    if (typeof value === 'string' || value instanceof String) { 
    return value; 
    } 
    crash('a String', value); 
} 

而這裏的一個JavaScript相當於(:=)運營商:

function decodeField(field, decoder) { 
    return function(value) { 
    var subValue = value[field]; 
    if (subValue !== undefined) { 
     return decoder(subValue); 
    } 
    crash("an object with field '" + field + "'", value); 
    }; 
} 

TL; DR

(:=)映射的字符串鍵一個回調(它不完全是一個回調,但這是你能想到的最接近的),它將檢查JavaScript對象中值的類型,將其轉換爲Elm值。

3

它需要一個密鑰你在操作字典和嘗試解碼什麼在那裏發現瞭解碼器,如任何內置的那些的甚至你自己定製的。

它本質上是一個訪問at

at ["name"] string 

等於:

"name" := string 
5

它創建了一個JSON字符串給定鍵的解碼器。

"name" := string 

創建一個在「名稱」中提取的值,並把它傳遞給解碼器string一個解碼器。