【发布时间】:2016-08-31 17:36:21
【问题描述】:
首先,我绝对确定我的做法是错误的,因为我仍在学习来自 Ruby 的 Elixir...
我从 youtube 获取搜索结果列表,并尝试提取观看次数最多的视频。
# html is the contents of the search results page
metas = html |> Floki.find(".yt-lockup-meta-info > li")
counter = -1
index = -1
high_views = 0
Enum.each(metas, fn(li) ->
counter = counter + 1
text = Floki.text(li)
case String.split(text, " ") do
[count, "views"] ->
views = String.to_integer(String.replace(count, ",", ""))
IO.puts(">>> #{counter} - #{to_string(views)} views")
if views > high_views do
high_views = views
index = counter
end
[age, time_measurement, "ago"] ->
nil
end
end)
metas 是li 元组的列表,如下所示:
[{"li", [], ["2 years ago"]}, {"li", [], ["5,669,783 views"]},
{"li", [], ["9 years ago"]}, {"li", [], ["17,136,804 views"]},
...
{"li", [], ["1 year ago"]}, {"li", [], ["15,217 views"]},
{"li", [], ["8 years ago"]}, {"li", [], ["909,053 views"]}]
这不起作用,因为传递给 Enum.each 的匿名函数有自己的范围,并且不会设置 index 和 high_views 的值。
有没有办法将值从外部范围传递到匿名函数?或者一个更好的问题是,我应该怎么做?
我打算让它工作,然后重构代码,但我被卡住了。感谢您的帮助。
【问题讨论】:
标签: elixir