入出力を扱う関数は、IOモジュールで提供されています。
IO.puts/2は、文字列を標準出力に書き込み、その後に改行を加えます。戻り値は:okです。IO.write/2は、文字列を標準出力に書き込みますが、改行は加えません。戻り値は:okです。IO.gets/2は、標準入力から1行読み取ります。IO.inspect/2は、どんな値でも標準出力に書き込み、:labelのような便利なオプションを受け付けます。渡された値をそのまま返します。デバッグに便利です。String.CharsプロトコルIO.puts/2に、出力できない値を渡そうとすると、Protocol.UndefinedErrorエラーが表示されます。
IO.puts({:ok, 7})
# ** (Protocol.UndefinedError) protocol String.Chars not implemented for {:ok, 7} of type Tuple
そんなときは、代わりにIO.inspect/2を使うとよいでしょう。
IO.inspect/2
IO.inspect/2は、引数をそのまま返し、どんな値でも出力でき、さらに:labelオプションも使えるので、デバッグにぴったりです。
"HELLO\n"
|> String.trim()
|> IO.inspect(label: "step 1")
|> String.downcase()
|> IO.inspect(label: "step 2")
# > step 1: "HELLO"
# > step 2: "hello"
# => "hello"
これらの関数の第1引数はIOデバイスで、デフォルト値は:stdio(標準入出力)です。標準エラー出力に書き込むには、代わりに:stderrを使います。IOデバイスはプロセスでもかまいません。たとえば、File.open/2を呼び出して作成したプロセスを使えば、ファイルに書き込むこともできます。