Enum.each / 2返回:ok而不是列表

时间:2019-04-08 15:29:19

标签: elixir

我拥有的函数使用一些用html编写的表,并将其转换为6元组原子字符串对的列表(例如“ ...<tbody><tr><td> name: dave ...” ---> ({:name, "dave"}, {:lesson, "dave"}, {...})。我使用Enum.each进行迭代遍历每一行并用正确的值替换它。该算法可以工作,但它不会返回所得到的答案,它只是返回:ok原子而不是实际的数据结构。也许是我对函数式语言缺乏了解。

我已经读到,最后一行是长生不老药将作为返回值,但是显然没有这样做。当我在枚举器函数中打印该行时,它将变成正确的输出。但是,如果我在枚举之外都做同样的事情:

rows = Enum.each(...)
IO.puts rows

再次给我:ok

#takes the html of table and returns a label-value pair for each students lesson from tutorful
  def convertRec(table) do
    rows = find_all_within_element(table, :tag, "tr")
    ## enumerate through table to find client-lesson info
    Enum.each(rows, fn row ->
      rowLabel = [:name, :lesson, :date, :time, :price, :status]

      row = find_all_within_element(row, :tag, "td")
        |> Enum.map(fn x -> String.split(inner_text(x), "\n", trim: true) end)
        |> Enum.concat()
        |> Enum.chunk_every(6) # 6 = length(rowLabel)
        |> Enum.map(fn vals -> vals = Enum.zip(rowLabel, vals) end)
      #for vals <- rowRecord do
      #  Enum.each(vals, fn {key, val} -> IO.puts "#{key} --> #{val}" end)
      #end

    end)
  end

我希望运行它:

rows = convertRec(table)
for rowRecord <- rows do
      for pairs <- rowRecord do
        Enum.each(pairs, fn {key, val} -> IO.puts "#{key} --> #{val}" end)
      end
    end

并获得

name--> dave
lesson --> maths
...

但是我只收到错误消息:“未为:ok实现协议Enumerable”

1 个答案:

答案 0 :(得分:1)

您要查找的是Enum.map/2,而不是Enum.each/2Enum.each/2仅返回:okEnum.map返回一个新列表。