【发布时间】:2018-08-29 20:33:53
【问题描述】:
我对 Elixir 还很陌生,但我遇到了一个小企业问题。我正在尝试对我的 Phoenix 中间层的 api 调用中返回的数据进行本地化。我正在获取用户的浏览器语言并将其解析为列表。语言的顺序是相关的。我想从支持的语言列表中的浏览器语言列表中找到第一个匹配的语言。
我可以用嵌套循环和所有这些来做到这一点,但这似乎是 Elixir 可以做得更优雅的事情。
【问题讨论】:
我对 Elixir 还很陌生,但我遇到了一个小企业问题。我正在尝试对我的 Phoenix 中间层的 api 调用中返回的数据进行本地化。我正在获取用户的浏览器语言并将其解析为列表。语言的顺序是相关的。我想从支持的语言列表中的浏览器语言列表中找到第一个匹配的语言。
我可以用嵌套循环和所有这些来做到这一点,但这似乎是 Elixir 可以做得更优雅的事情。
【问题讨论】:
使用Enum.find/3:
user = ~w|ge es it|
supported = ~w|it ru en|
Enum.find(user, 'en', fn l -> Enum.empty?([l] -- supported) end)
这里'en' 是返回的默认语言,因为没有找到匹配的语言。如果没有匹配项,[l] -- supported(列表干扰)将返回 [l],如果 supported 中存在 l,则返回 []。
或者,或者,使用嵌套的Enum.find/3]:
Enum.find(user, 'en', fn l -> Enum.find(supported, & &1 == l) end)
【讨论】:
将您支持的语言转换成一个集合:
supported_langs = ["a", "b", "c"]
user_langs = ["z", "s", "b", "a"]
supported_langs_set = supported_langs |> Enum.into(MapSet.new)
Enum.find(user_langs, fn user_lang ->
MapSet.member? supported_langs_set, user_lang
end)
在集合中查找内容很快 v. 一遍又一遍地遍历supported_langs 列表寻找每个user_lang。但是,如果您的列表只有几个元素,则不会有太大的不同。
【讨论】: