Как мне `сказать` и` напечатать` в буфер?
В Perl 6 тип Str является неизменяемым, поэтому разумно использовать изменяемый буфер вместо объединения большого количества строк. Далее мне нравится возможность использовать один и тот же API независимо от того, выполняет ли моя функция запись в стандартный вывод, файл или в буфер в памяти.
В Perl я могу создать файл в памяти, как
my $var = "";
open my $fh, '>', \$var;
print $fh "asdf";
close $fh;
print $var; # asdf
Как мне добиться того же в Perl 6?
2 ответа
Решение
В настоящее время я делаю объединение строк в классе как временное решение.
class Buffer {
has $!buf = "";
multi method print($string) {
$!buf ~= $string;
}
multi method say($string) {
$!buf ~= $string ~ "\n";
}
multi method Str() {
return $!buf;
}
}
С этим я могу сделать
my $buf = Buffer.new();
say $buf: "asdf";
print $buf.Str;
В экосистеме есть минимальный IO::String, поддерживаемый массивом.
Для одноразового решения вы также можете сделать что-то вроде
my $string;
my $handle = IO::Handle.new but role {
method print(*@stuff) { $string ~= @stuff.join };
method print-nl { $string ~= "\n" }
};
$handle.say("The answer you're looking for is 42.");
dd $string;