Help us understand the problem. What is going on with this article?

Elixirで進捗表示したい!

はじめに

0. 準備

  • Elixirをインストールしましょう
  • 手前味噌の記事ですが、インストール等ご参考にしてください

ソースコードを書く

  • 今回は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

output.gif

:tada::tada::tada:

Wrapping Up :lgtm: :qiita-fabicon: :lgtm:

fukuokaex
エンジニア/企業向けにElixirプロダクト開発・SI案件開発を支援する福岡のコミュニティ
https://fukuokaex.fun/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away