在 IO::Handle 中§
请参阅 上下文中的主要文档 以了解方法 READ
method READ(IO::Handle: Int \bytes --> Buf)
每当对句柄执行读取操作时都会调用。接收请求读取的字节数。返回一个 Buf
,其中包含可用于填充解码器缓冲区或直接从读取方法返回的字节。允许结果少于请求的字节数,包括根本没有字节。
如果您提供自己的 .READ
,则很可能还需要提供自己的 .EOF
,以便所有功能都能正常运行。
编译器可以在读取操作期间多次调用 .EOF
方法,以确定是否应调用 .READ
。可能从 .READ
请求比满足读取操作所需的更多字节,在这种情况下,额外数据可能由 IO::Handle
或其正在使用的解码器缓冲,以满足任何后续读取操作,而无需再进行 .READ
调用。
is IO::Handlemy := IO::Store.new();.print( ) for <one two three>;say .read(3).decode; # OUTPUT: «one»say .read(3).decode; # OUTPUT: «two»
在这种情况下,我们对两个 READ
和 EOF
方法以及 WRITE
进行了编程,后者将每一行存储为数组中的一个元素。read
方法实际上调用 READ
,返回 3 个字节,这对应于前两个元素中的三个字符。请注意,负责游标的是 IO::Handle
基类,因为 READ
只是提供对对象全部内容的句柄;基类一次将 READ
1024 * 1024 个字节。如果计划让您的对象容纳比这更大的字节数,则您将必须自己处理内部游标。这就是为什么在这个示例中我们实际上不使用 bytes
参数的原因。