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

В Perl 6 тип Str является неизменяемым, поэтому кажется разумным использовать изменяемый буфер вместо объединения большого количества строк. Далее, мне нравится возможность использовать один и тот же API независимо от того, пишет ли моя функция в стандартный вывод, в файл или в буфер в памяти.

В Perl я могу создать такой файл в памяти

my $var = "";
open my $fh, '>', \$var;
print $fh "asdf";
close $fh;
print $var;          # asdf

Как добиться того же в Perl 6?


person user7610    schedule 26.10.2015    source источник
comment
cf stackoverflow.com/questions/28702850/   -  person Christoph    schedule 26.10.2015


Ответы (2)


Минимальный 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;
person Christoph    schedule 26.10.2015

В настоящее время я делаю конкатенацию строк в классе в качестве временного решения.

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;
person user7610    schedule 26.10.2015