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