在 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)

如果您需要在列表中包含其他类型(例如,浮点数),则复杂性会增加。