:= 运算符在 Elm 中究竟做了什么?
What exactly does the := operator do in Elm?
这是来自文档的一个不清楚的示例,使用了这个运算符:http://package.elm-lang.org/packages/elm-lang/core/3.0.0/Json-Decode#at
它获取您正在操作的词典的密钥,并尝试使用解码器解码在那里找到的内容,例如任何内置的甚至您自己定制的。
本质上是单次访问at
。
at ["name"] string
等于:
"name" := string
它为 json 字符串中的给定键创建解码器。
"name" := string
创建一个解码器,提取 "name" 中的值并将其传递给 string
解码器。
请注意 (:=) is removed from Json.Decode 从 0.18.0
开始
中缀运算符
在Elm中,你可以定义自定义infix operators,它们存在的目的是为了提供一个更具可读性的代码版本。具有讽刺意味的是,当你不熟悉这个概念时,它的作用恰恰相反。
(:=) is a custom infix operator, provided by Json.Decode 包。
请考虑以下自定义中缀运算符示例:
import Html exposing (text)
(<|>) : String -> String -> String
(<|>) beginning end =
beginning ++ "Bar" ++ end
main =
text ("Foo" <|> "Buz") -- "FooBarBuz"
强烈建议避免使用自定义中缀运算符。
让我们回到 (:=) 运算符。
它的类型定义看起来像 (:=) : String -> Decoder a -> Decoder a
,这意味着我们必须从可用列表 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 值时。
这是来自文档的一个不清楚的示例,使用了这个运算符:http://package.elm-lang.org/packages/elm-lang/core/3.0.0/Json-Decode#at
它获取您正在操作的词典的密钥,并尝试使用解码器解码在那里找到的内容,例如任何内置的甚至您自己定制的。
本质上是单次访问at
。
at ["name"] string
等于:
"name" := string
它为 json 字符串中的给定键创建解码器。
"name" := string
创建一个解码器,提取 "name" 中的值并将其传递给 string
解码器。
请注意 (:=) is removed from Json.Decode 从 0.18.0
中缀运算符
在Elm中,你可以定义自定义infix operators,它们存在的目的是为了提供一个更具可读性的代码版本。具有讽刺意味的是,当你不熟悉这个概念时,它的作用恰恰相反。
(:=) is a custom infix operator, provided by Json.Decode 包。
请考虑以下自定义中缀运算符示例:
import Html exposing (text)
(<|>) : String -> String -> String
(<|>) beginning end =
beginning ++ "Bar" ++ end
main =
text ("Foo" <|> "Buz") -- "FooBarBuz"
强烈建议避免使用自定义中缀运算符。
让我们回到 (:=) 运算符。
它的类型定义看起来像 (:=) : String -> Decoder a -> Decoder a
,这意味着我们必须从可用列表 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 值时。