Возвращение Enum.each / 2: нормально вместо списка - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть функция, которая берет некоторую таблицу, написанную на 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
...

но я просто получаю сообщение об ошибке "Enumerable protocol не реализован для: ok"

1 Ответ

1 голос
/ 08 апреля 2019

Вы ищете Enum.map/2, а не Enum.each/2.Enum.each/2 только когда-либо возвращает :ok.Enum.map возвращает новый список.

...