Elixir - 如何在Iex

时间:2017-05-05 18:00:12

标签: elixir

我正在用Ecto做一个小的Cli程序,当我查询一些结果时,我得到一个列表,并且在我学习Elixir的时候,我在终端中无法做的事情是格式化返回列表的函数的输出。

当我运行Repo.all(from u in Entry, select: u.title)时,我会得到一个这样的列表:

["test title", "second title"]我希望将输出格式化为:

*****
test title
*****
second title

列表中每个项目的一个分区,但我不知道如何完成它或这样做的有效方式。我已经尝试过列表推导但很好......它返回一个列表。试过管道Enum.map/2IO.puts/1没有结果所以我现在需要一些帮助: - )

2 个答案:

答案 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)>