Курс Raku / Об’єкти, введення-виведення та винятки / Введення та виведення / Файлові дескриптори / Вправи / Передайте дескриптор у функцію

Розв’язання: Передайте дескриптор у функцію

Ось один із можливих варіантів розв’язання задачі.

Код

sub log-line($fh, $message) {
    $fh.say($message);
}

my $fh = open 'log.txt', :w;
log-line($fh, 'started');
log-line($fh, 'working');
log-line($fh, 'done');
$fh.close;

print slurp 'log.txt';

🦋 Вихідний код можна знайти у файлі pass-a-handle.raku.

Вивід

started
working
done

Коментарі

  1. Дескриптор, який повертає open, є просто значенням, що зберігається в $fh, тож його можна передати до log-line аргументом, як будь-який рядок чи число. Усередині підпрограми $fh.say пише через той самий відкритий дескриптор.

  2. Оскільки дескриптор лишається відкритим упродовж усіх трьох викликів, кожен log-line дописує до того самого файлу ще один рядок. Далі close усе скидає на диск, а slurp зчитує три рядки назад.

  3. Саме це й робить дескриптори композиційними: функція може приймати дескриптор і писати в нього (чи читати з нього), не переймаючись тим, на який файл він вказує, — це вирішує викликач, коли відкриває файл.

Навігація курсом

Передайте дескриптор у функцію   |   Тест — Читання рядків