はじめに
- @kuroitu さんのPythonで進捗表示したい!を拝見しまして、私はElixirでやってみようとおもいます
- 上記記事中のプログレスバーを作ってみるをやってみます
0. 準備
ソースコードを書く
- 今回は
progress.exs
ファイルをそのへんにつくるだけにします
progress.exs
f = fn
n when is_integer(n) -> Process.sleep(n)
s -> IO.write("\r[#{s}]")
end
1..50
|> Enum.map(&String.duplicate("#", &1))
|> Enum.intersperse(100)
|> Enum.each(&f.(&1))
-
f
に束縛した無名関数は引数が整数の時にはProcess.sleep/1を実行してスリープします - 整数ではない場合にはIO.write/1を呼び出して出力をしています
- 元の記事にありますように
\r
が出力する文字列の先頭にあることがポイントです -
1..50
ではじまる行からは以下の関数や、Pipe operator |>を使って気持ちよく書いています -
Enum.intersperse(100)
を実行した時点で下記のようなリストができています
["#", 100, "##", 100, "###", 100, "####", 100, "#####", 100, "######", 100,
"#######", 100, "########", 100, "#########", 100, "##########", 100,
"###########", 100, "############", 100, "#############", 100,
"##############", 100, "###############", 100, "################", 100,
"#################", 100, "##################", 100, "###################",
100, "####################", 100, "#####################", 100,
"######################", 100, "#######################", 100,
"########################", 100, "#########################", 100, ...]
- 文字列と
100
が交互に入っているリストになっています
progress.exs
1..50
|> Enum.map(&String.duplicate("#", &1))
|> Enum.intersperse(100)
|> IO.inspect()
|> Enum.each(&f.(&1))
- ってな感じで途中がどうなっているのかをIO.inspect/1で出力して確認するのはよくやることです
実行する
$ elixir progress.exs
Wrapping Up
- Enjoy Elixir !!!