Курс языка программирования Raku / Объекты, ввод-вывод и исключения / Ввод и вывод / Файловые дескрипторы / Exercises / Передайте дескриптор в функцию

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

Вот один из возможных вариантов решения задачи.

Код

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. Именно это делает дескрипторы компонуемыми: функция может принимать дескриптор и писать в него (или читать из него), не заботясь о том, на какой файл он указывает, — это решает вызывающая сторона, когда открывает файл.

Навигация по курсу

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