通过多种方法传递时,Elixir 列表不会更新
Elixir list is not updating when passed through multiple methods
def create(conn, params) do
conn
|> render_json_response(bulk_convertor(params))
end
def bulk_convertor(%{"file" => %Plug.Upload{content_type: "text/csv", filename: basename,
path: fullpath}}) do
list = [~w(old, new)]
fullpath
|> read_csv(list)
|> form_response
end
def read_csv(path, list) do
if path |> File.stream! |> Enum.count <= 50 do
path
|> File.stream!
|> Parser.parse_stream
|> Stream.map(fn [arg] -> %{url: arg} end)
|> iterate_urls(list)
else
%{error: %{message: "Limit Exceeded"}}
end
end
def iterate_urls(mapped_stream, list) do
mapped_stream
|> Enum.each(fn(url) -> url_convertor(url, list) end)
%{response: %{message: "Request Initiated"}}
end
def url_convertor(%{url: val}, list) do
with {:ok, %Route{} = route} <- App.create_route(%{"url" => val}) do
route
|> App.redirect_url
|> add_to_list(route, list)
end
end
def add_to_list(new_url, %{url: original_url}, list) do
list = List.insert_at(list, -1, ~w(#{original_url}, #{new_url}))
list
end
每当我尝试使用 IO.inspect 在某处打印它时,列表内容都不会更新,它显示初始列表。
我正在尝试根据我正在使用 elixir 的 nimble_csv 库解析的 csv 解析的数据更新列表的内容。
如果我尝试打印里面的列表
add_to_list
只有两行可见,即我最初添加的 header 和 CSV 中的最后一行。
我这里有什么地方做错了吗?
你在add_to_list
函数中创建了一个新的list
函数,函数returns新建了list
但是你忽略了它。数据结构在 Elixir 中是不可变的。查看此答案:
当我知道 elixir 中的 DS 是不可变的时,我可以通过对下面的函数做一些小改动来解决上述问题
def iterate_urls(mapped_stream) do
mapped_stream
|> Enum.flat_map(fn(url) -> url_convertor(url) end)
|> dump_to_csv
%{response: %{message: "Request Initiated"}}
end
其余部分保持不变,现在这一行
Enum.flat_map(fn(url) -> url_convertor(url) end)
return 我想要的列表。
def create(conn, params) do
conn
|> render_json_response(bulk_convertor(params))
end
def bulk_convertor(%{"file" => %Plug.Upload{content_type: "text/csv", filename: basename,
path: fullpath}}) do
list = [~w(old, new)]
fullpath
|> read_csv(list)
|> form_response
end
def read_csv(path, list) do
if path |> File.stream! |> Enum.count <= 50 do
path
|> File.stream!
|> Parser.parse_stream
|> Stream.map(fn [arg] -> %{url: arg} end)
|> iterate_urls(list)
else
%{error: %{message: "Limit Exceeded"}}
end
end
def iterate_urls(mapped_stream, list) do
mapped_stream
|> Enum.each(fn(url) -> url_convertor(url, list) end)
%{response: %{message: "Request Initiated"}}
end
def url_convertor(%{url: val}, list) do
with {:ok, %Route{} = route} <- App.create_route(%{"url" => val}) do
route
|> App.redirect_url
|> add_to_list(route, list)
end
end
def add_to_list(new_url, %{url: original_url}, list) do
list = List.insert_at(list, -1, ~w(#{original_url}, #{new_url}))
list
end
每当我尝试使用 IO.inspect 在某处打印它时,列表内容都不会更新,它显示初始列表。 我正在尝试根据我正在使用 elixir 的 nimble_csv 库解析的 csv 解析的数据更新列表的内容。
如果我尝试打印里面的列表
add_to_list
只有两行可见,即我最初添加的 header 和 CSV 中的最后一行。
我这里有什么地方做错了吗?
你在add_to_list
函数中创建了一个新的list
函数,函数returns新建了list
但是你忽略了它。数据结构在 Elixir 中是不可变的。查看此答案:
当我知道 elixir 中的 DS 是不可变的时,我可以通过对下面的函数做一些小改动来解决上述问题
def iterate_urls(mapped_stream) do
mapped_stream
|> Enum.flat_map(fn(url) -> url_convertor(url) end)
|> dump_to_csv
%{response: %{message: "Request Initiated"}}
end
其余部分保持不变,现在这一行
Enum.flat_map(fn(url) -> url_convertor(url) end)
return 我想要的列表。