Курс языка программирования 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Комментарии
Дескриптор, который возвращает
open, — это просто значение, хранящееся в$fh, поэтому его можно передать вlog-lineкак аргумент, наравне с любой строкой или числом. Внутри подпрограммы$fh.sayпишет через тот же самый открытый дескриптор.Поскольку дескриптор остаётся открытым на протяжении всех трёх вызовов, каждый
log-lineдописывает очередную строку в тот же файл. Затемcloseвсё сбрасывает, аslurpсчитывает три строки обратно.Именно это делает дескрипторы компонуемыми: функция может принимать дескриптор и писать в него (или читать из него), не заботясь о том, на какой файл он указывает, — это решает вызывающая сторона, когда открывает файл.