在 IO::Handle 中§

请参阅 上下文中的主要文档 以了解方法 READ

method READ(IO::Handle:D: Int:D \bytes --> Buf:D)

每当对句柄执行读取操作时都会调用。接收请求读取的字节数。返回一个 Buf,其中包含可用于填充解码器缓冲区或直接从读取方法返回的字节。允许结果少于请求的字节数,包括根本没有字节。

如果您提供自己的 .READ,则很可能还需要提供自己的 .EOF,以便所有功能都能正常运行。

编译器可以在读取操作期间多次调用 .EOF 方法,以确定是否应调用 .READ。可能从 .READ 请求比满足读取操作所需的更多字节,在这种情况下,额外数据可能由 IO::Handle 或其正在使用的解码器缓冲,以满足任何后续读取操作,而无需再进行 .READ 调用。

class IO::Store is IO::Handle {
    has @.lines = [];
 
    submethod TWEAK {
      self.encoding: 'utf8'# set up encoder/decoder 
    }
 
    method WRITE(IO::Handle:D: Blob:D \data --> Bool:D{
      @!lines.push: data;
      True;
    }
 
    method whole() {
      my Buf $everything = Buf.new();
      for @!lines -> $b {
        $everything ~= $b;
      }
      return $everything;
    }
 
    method READ(IO::Handle:D: Int:D \bytes --> Buf:D{
      my Buf $everything := self.whole();
      return $everything;
    }
 
    method EOF {
      my $everything = self.whole();
      !$everything;
    }
}
 
my $store := IO::Store.new();
 
$store.print$_ ) for <one two three>;
say $store.read(3).decode# OUTPUT: «one␤» 
say $store.read(3).decode# OUTPUT: «two␤» 

在这种情况下,我们对两个 READEOF 方法以及 WRITE 进行了编程,后者将每一行存储为数组中的一个元素。read 方法实际上调用 READ,返回 3 个字节,这对应于前两个元素中的三个字符。请注意,负责游标的是 IO::Handle 基类,因为 READ 只是提供对对象全部内容的句柄;基类一次将 READ 1024 * 1024 个字节。如果计划让您的对象容纳比这更大的字节数,则您将必须自己处理内部游标。这就是为什么在这个示例中我们实际上不使用 bytes 参数的原因。