我正在用Ecto做一个小的Cli程序,当我查询一些结果时,我得到一个列表,并且在我学习Elixir的时候,我在终端中无法做的事情是格式化返回列表的函数的输出。
当我运行Repo.all(from u in Entry, select: u.title)
时,我会得到一个这样的列表:
["test title", "second title"]
我希望将输出格式化为:
*****
test title
*****
second title
列表中每个项目的一个分区,但我不知道如何完成它或这样做的有效方式。我已经尝试过列表推导但很好......它返回一个列表。试过管道Enum.map/2
到IO.puts/1
没有结果所以我现在需要一些帮助: - )
答案 0 :(得分:2)
我会使用Enum.map_join/3
:
iex(1)> ["test title", "second title"] |>
...(1)> Enum.map_join("\n", &["*****\n", &1]) |>
...(1)> IO.puts
*****
test title
*****
second title
答案 1 :(得分:1)
你可以试试这个
Repo.all(from u in Entry, select: u.title) |>
Enum.reduce([], fn item, acc ->
["********", item | acc]
end) |> Enum.reverse |> Enum.join("\n") |> IO.puts
或更可重用的方法
iex(8)> display = fn list -> list |> Enum.reduce([], fn item, acc -> ["**********", item | acc] end) |> Enum.reverse |> Enum.join("\n") |> IO.puts end
#Function<6.54118792/1 in :erl_eval.expr/5>
iex(9)> ["test title", "second title"] |> display.() test title
**********
second title
**********
:ok
iex(10)> ~w(one two three four) |> display.()
one
**********
two
**********
three
**********
four
**********
:ok
iex(11)>
我经常在iex中使用anoyn函数方法。可以创建这样的小函数并重用它们而无需定义模块。
在这里,我将display
函数添加到我的.iex.exs
文件中。从新的iex会话中运行它
Interactive Elixir (1.4.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> ~w(one two) |> display.()
one
**********
two
**********
:ok
iex(2)>
修改
如果您想要一个真正的通用解决方案,您可以覆盖iex中的检查协议。但是,如果在任何地方使用检查,这可能会影响您的程序。
ex(7)> defimpl Inspect, for: List do
...(7)> def inspect(list, _opt \\ []), do: Enum.map_join(list, "\n", &(["*******\n", &1]))
...(7)> end
warning: redefining module Inspect.List (current version defined in memory)
iex:7
{:module, Inspect.List,
<<70, 79, 82, 49, 0, 0, 7, 184, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 242,
131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115,
95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>, {:__impl__, 1}}
iex(8)> ["Test one", "Test two"]
*******
Test one
*******
Test two
iex(9)>