我如何将`say`和`print`放入缓冲区?

问题描述 投票:3回答:2

在Perl 6中,Str类型是不可变的,因此使用可变缓冲区而不是串联很多字符串似乎是合理的。接下来,无论我的函数是向标准输出,文件还是向内存缓冲区写入数据,我都希望能够使用相同的API。

在Perl中,我可以像这样创建一个内存文件

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

如何在Perl 6中实现相同的目的?

io perl6 raku rakudo
2个回答
3
投票

[由数组支持的IO::String中有最小的ecosystem

对于一次性解决方案,您也可以做类似的事情

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;

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;
© www.soinside.com 2019 - 2024. All rights reserved.