Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Io 如何将“say”和“print”写入缓冲区?_Io_Raku_Rakudo - Fatal编程技术网

Io 如何将“say”和“print”写入缓冲区?

Io 如何将“say”和“print”写入缓冲区?,io,raku,rakudo,Io,Raku,Rakudo,在Perl 6中,Str类型是不可变的,因此使用可变缓冲区而不是串联大量字符串似乎是合理的。接下来,我喜欢能够使用相同的API,无论我的函数是写入标准输出、文件还是内存缓冲区 在Perl中,我可以像这样在内存中创建一个文件 my $var = ""; open my $fh, '>', \$var; print $fh "asdf"; close $fh; print $var; # asdf 如何在Perl 6中实现同样的功能?我目前所做的是将字符串串联作为临时解决方

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

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

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

如何在Perl 6中实现同样的功能?

我目前所做的是将字符串串联作为临时解决方案包装到类中

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;
有一个数组支持的最小值

对于一次性解决方案,您还可以执行以下操作

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;
查阅