الدوال الخاصة بمعالجة الإدخال والإخراج توفّرها وحدة IO.
IO.puts/2 تكتب سلسلة نصية إلى المخرج القياسي، متبوعةً بسطر جديد، وتُرجع :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"
الوسيط الأول في كل تلك الدوال هو جهاز IO، وقيمته الافتراضية :stdio (المدخل/المخرج القياسي). وللكتابة إلى جهاز الخطأ القياسي، استخدم :stderr بدلًا منه. ويمكن أن يكون جهاز IO أيضًا عملية، مثل عملية تُنشأ باستدعاء File.open/2، ما يسمح بالكتابة إلى ملف.