Как мне `сказать` и` напечатать` в буфер?

В 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;
Другие вопросы по тегам