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