如何将 `say` 和 `print` 放入缓冲区?
How do I `say` and `print` into a buffer?
在 Perl 6 中,Str 类型是不可变的,因此使用可变缓冲区而不是连接大量字符串似乎是合理的。接下来,我喜欢能够使用相同的 API,无论我的函数是写入标准输出、文件还是内存缓冲区。
在 Perl 中,我可以像这样创建一个内存文件
my $var = "";
open my $fh, '>', $var;
print $fh "asdf";
close $fh;
print $var; # asdf
如何在 Perl 6 中实现相同的功能?
我目前做的是将字符串连接包装在 class 中作为临时解决方案。
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 in the 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;
在 Perl 6 中,Str 类型是不可变的,因此使用可变缓冲区而不是连接大量字符串似乎是合理的。接下来,我喜欢能够使用相同的 API,无论我的函数是写入标准输出、文件还是内存缓冲区。
在 Perl 中,我可以像这样创建一个内存文件
my $var = "";
open my $fh, '>', $var;
print $fh "asdf";
close $fh;
print $var; # asdf
如何在 Perl 6 中实现相同的功能?
我目前做的是将字符串连接包装在 class 中作为临时解决方案。
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 in the 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;