在 Elixir 中,如何将字符串列表 ["3"、"4"、"-2"、"20"、"false"] 作为函数 def linear(m,c,min,max) 的参数,_)
In Elixir, how can I take a list of Strings ["3", "4", "-2", "20", "false"] as params for a function def linear(m,c,min,max,_)
我有一个 Elixir 函数,例如:
def linear(m,c,min,max,_) when someCondition do something end
我有一个字符串列表:["3", "4", "-2", "20", "false"]
如何将此列表转换为 [3,4,-2,20,false]
以便我可以:
desiredFormat |> linear()
或类似的。
使用 String.to_atom(head)
适用于 "false"
并使用:
String.to_integer(head)
适用于整数字符串,但我找不到像这样的 'mixed' 列表的解决方案。
我希望这是有道理的。谢谢
您不能 "derive" 将列表中的每个元素转换为的类型,因为它们都是字符串。因为看起来你事先知道列表的大小和顺序,你可以简单地做一些像这样的工作:
def parse_list([m, c, min, max, bool]) do
[String.to_integer(m),
String.to_integer(c),
String.to_integer(min),
String.to_integer(max),
String.to_existing_atom(bool)]
end
parse_list(["3", "4", "-2", "20", "false"])
#=> [3, 4, -2, 20, false]
现在,如果您想在 linear/5
中直接使用这些参数,您可以使用 apply/2
:
apply(&linear/5, parse_list(my_list))
顺便提一下:存在另一种解决方案,它解析字符串中的每个元素以推断其类型。如果你的列表总是只包含整数和布尔值,那么编写一个超级简单的解析器就很简单了:
def parse_elem("true"), do: true
def parse_elem("false"), do: false
def parse_elem(int), do: String.to_integer(int)
apply(&linear/5, Enum.map(my_list, &parse_elem/1)
如果您需要在列表中包含其他类型(例如,浮点数),则复杂性会增加。
我有一个 Elixir 函数,例如:
def linear(m,c,min,max,_) when someCondition do something end
我有一个字符串列表:["3", "4", "-2", "20", "false"]
如何将此列表转换为 [3,4,-2,20,false]
以便我可以:
desiredFormat |> linear()
或类似的。
使用 String.to_atom(head)
适用于 "false"
并使用:
String.to_integer(head)
适用于整数字符串,但我找不到像这样的 'mixed' 列表的解决方案。
我希望这是有道理的。谢谢
您不能 "derive" 将列表中的每个元素转换为的类型,因为它们都是字符串。因为看起来你事先知道列表的大小和顺序,你可以简单地做一些像这样的工作:
def parse_list([m, c, min, max, bool]) do
[String.to_integer(m),
String.to_integer(c),
String.to_integer(min),
String.to_integer(max),
String.to_existing_atom(bool)]
end
parse_list(["3", "4", "-2", "20", "false"])
#=> [3, 4, -2, 20, false]
现在,如果您想在 linear/5
中直接使用这些参数,您可以使用 apply/2
:
apply(&linear/5, parse_list(my_list))
顺便提一下:存在另一种解决方案,它解析字符串中的每个元素以推断其类型。如果你的列表总是只包含整数和布尔值,那么编写一个超级简单的解析器就很简单了:
def parse_elem("true"), do: true
def parse_elem("false"), do: false
def parse_elem(int), do: String.to_integer(int)
apply(&linear/5, Enum.map(my_list, &parse_elem/1)
如果您需要在列表中包含其他类型(例如,浮点数),则复杂性会增加。