Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming Elixir从json/struct获取键/值对_Functional Programming_Elixir - Fatal编程技术网

Functional programming Elixir从json/struct获取键/值对

Functional programming Elixir从json/struct获取键/值对,functional-programming,elixir,Functional Programming,Elixir,作为Elixir和函数式编程的新手,我在从这个结构获取“taste”键时遇到了一些问题 json = response.body icecream = Poison.decode!(json, as: %{"items" => [%Icecream{}]}) Returns: [%{"items" => [%MyModule.Icecream{size: "Large", taste: "Pistachio"}]}] 我只想以最优化的方式将味道(“开心果”)保存到变量中 我期待

作为Elixir和函数式编程的新手,我在从这个结构获取“taste”键时遇到了一些问题

json = response.body
icecream = Poison.decode!(json, as: %{"items" => [%Icecream{}]})

Returns:
[%{"items" => [%MyModule.Icecream{size: "Large",
 taste: "Pistachio"}]}]
我只想以最优化的方式将味道(“开心果”)保存到变量中

我期待得到启发。:)

解决方案: 我自己想出来的:

taste = List.first(icecream["items"]).taste

使用管道,您可以

icecream |> hd |> Map.get("items") |> hd |> Map.get(:taste)
但是,我建议您结合使用,IMO会产生非常可读的代码,并且对于更复杂的情况似乎更好

import Access
get_in icecream, [at(0), key!("items"), at(0), key!(:taste)]

使用管道,您可以

icecream |> hd |> Map.get("items") |> hd |> Map.get(:taste)
但是,我建议您结合使用,IMO会产生非常可读的代码,并且对于更复杂的情况似乎更好

import Access
get_in icecream, [at(0), key!("items"), at(0), key!(:taste)]

您还可以使用简单的模式匹配:

[%{"items" => [%{taste: taste_val}]}] = your_result

它将
taste
值保存到变量
taste\u val
中。如果您的结果没有
味道
,当您使用模块定义结构时,它将被设置为
nil
(或您的默认值)。

您还可以使用简单的模式匹配:

[%{"items" => [%{taste: taste_val}]}] = your_result

它将
taste
值保存到变量
taste\u val
中。如果您的结果没有
味道
,当您使用模块定义结构时,它将被设置为
nil
(或您的默认值)。

您也可以使用
Map.get
Map.fetch
见:)

请记住,如果您正在使用

Map.fetch!(地图、钥匙)


当键不在
map
中时,可能会导致副作用(引发错误)。如果您正在使用
Map.fetch(Map,key)
您将返回一个状态为okerror的元组,表示
Map
中的
key
可用,您也可以使用
Map.get
Map.fetch
见:)

请记住,如果您正在使用

Map.fetch!(地图、钥匙)


当键不在
map
中时,可能会导致副作用(引发错误)。如果您使用的是
Map.fetch(Map,key)
您将返回一个状态为okerror的元组,表示
Map
中的
key
可用,谢谢您的回答。但是,我在第二个解决方案中遇到了一个编译器错误:未定义的函数位于/1Did you
import Access
?如果您担心名称空间混乱,也可以在单个函数的本地执行该操作。@PatrickOscity是否仅在Elixir的某些版本中可用?也许Zahrec正在使用一种旧版本的长生不老药?@OnorioCatenacci很好!似乎这是在1.3中添加的。我正在运行Elixir版本1.3.4感谢您的回答。但是,我在第二个解决方案中遇到了一个编译器错误:未定义的函数位于/1Did you
import Access
?如果您担心名称空间混乱,也可以在单个函数的本地执行该操作。@PatrickOscity是否仅在Elixir的某些版本中可用?也许Zahrec正在使用一种旧版本的长生不老药?@OnorioCatenacci很好!似乎这是在1.3中添加的。我正在运行Elixir 1.3.4版。您应该选择的方法将取决于您希望边缘案例的方式。当元素不存在时,您希望发生什么(如果您愿意处理该情况)?您希望它引发异常还是返回nil?还有什么?我希望它总是在那里,但我同意检查一下会更好。您应该选择的方法将取决于您希望边缘案例的方式。当元素不存在时,您希望发生什么(如果您愿意处理该情况)?您希望它引发异常还是返回nil?还有别的吗?我希望它总是在那里,但我同意如果能检查一下会更好。