Функції для роботи з введенням і виведенням надає модуль IO.
IO.puts/2 записує рядок тексту (англ. string) у стандартне виведення, а потім додає символ нового рядка. Повертає :ok.IO.write/2 записує рядок тексту у стандартне виведення, не додаючи символу нового рядка. Повертає :ok.IO.gets/2 читає рядок зі стандартного введення.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"
Першим аргументом усіх цих функцій є пристрій введення-виведення, який типово має значення :stdio (стандартне введення/виведення). Щоб писати в пристрій стандартних помилок, використаймо :stderr. Пристроєм введення-виведення може бути й процес, наприклад створений викликом File.open/2, що дало б змогу писати у файл.