توابعی برای مدیریت ورودی و خروجی توسط ماژول IO ارائه میشوند.
IO.puts/2 یک رشته را همراه با یک خط جدید در خروجی استاندارد مینویسد. مقدار :ok را برمیگرداند.IO.write/2 یک رشته را بدون افزودن خط جدید در خروجی استاندارد مینویسد. مقدار :ok را برمیگرداند.IO.gets/2 یک خط را از ورودی استاندارد میخواند.IO.inspect/2 هر دادهای را در خروجی استاندارد مینویسد و گزینههای مفیدی مثل :label را میپذیرد. مقداری را که به آن داده شده بدون تغییر برمیگرداند. برای Debug مفید است.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 برای DebugIO.inspect/2 برای Debug عالی است چون آرگومانش را بدون تغییر برمیگرداند، میتواند هر دادهای را چاپ کند و گزینهی :label را ارائه میدهد.
"HELLO\n"
|> String.trim()
|> IO.inspect(label: "step 1")
|> String.downcase()
|> IO.inspect(label: "step 2")
# > step 1: "HELLO"
# > step 2: "hello"
# => "hello"
اولین آرگومان همهی آن توابع یک دستگاه IO است، با مقدار پیشفرض :stdio (ورودی/خروجی استاندارد). برای نوشتن در دستگاه خطای استاندارد، بهجایش از :stderr استفاده کنید. یک دستگاه IO میتواند یک فرایند هم باشد، برای مثال فرایندی که با فراخوانی File.open/2 ایجاد میشود، که امکان نوشتن در یک فایل را فراهم میکند.