在 IO::Socket 角色中§

请参阅主要文档 in context 了解方法 close

method close(IO::Socket:D)

关闭套接字。

如果套接字未连接,则失败。

在 Channel 中§

请参阅主要文档 in context 了解方法 close

method close(Channel:D:)

正常关闭Channel。这会导致后续的send调用使用 X::Channel::SendOnClosed 终止。后续的.receive调用仍然可以消耗任何先前发送的剩余项目,但如果队列为空,则会抛出 X::Channel::ReceiveOnClosed 异常。由于您可以通过使用@()将上下文设置为数组或调用.list方法从Channel生成 Seq,因此这些方法在Channel关闭之前不会终止。whenever 块也会在关闭的Channel上正确终止。

my $c = Channel.new;
$c.close;
$c.send(1);
CATCH { default { put .^name''.Str } };
# OUTPUT: «X::Channel::SendOnClosed: Cannot send a message on a closed channel␤» 

请注意,抛出的任何异常都可能阻止调用.close,这可能会挂起接收线程。在这种情况下,使用 LEAVE 阶段器来强制调用.close

在 IO::Pipe 中§

请参阅主要文档 in context 了解方法 close

method close(IO::Pipe: --> Proc:D)

关闭管道并返回管道从中派生的 Proc 对象。

在 IO::Socket::Async 中§

请参阅主要文档 in context 了解方法 close

method close(IO::Socket::Async:D: )

关闭已从listen Supplyconnect Promise 获得的已连接客户端IO::Socket::Async

为了关闭由listen创建的底层侦听套接字,您可以close IO::Socket::Async::ListenSocket。有关示例,请参阅 listen

在 Tap 中§

请参阅主要文档 in context 了解方法 close

method close(Tap:D:)

关闭水龙头。

在 IO::CatHandle 中§

请参阅主要文档 in context 了解方法 close

method close(IO::CatHandle:D: --> True)

关闭当前活动的源句柄以及任何已打开的源句柄,并清空源句柄队列。与常规 IO::Handle 不同,在 IO::CatHandle 上通常不需要显式调用 .close,因为仅仅耗尽所有输入就会关闭所有需要关闭的句柄。

with IO::CatHandle.new: @bunch-of-handles {
    say .readchars: 42;
    .close# we are done; close all the open handles 
}

在 IO::Handle§

有关例程 close,请参阅 上下文中的主要文档

method close(IO::Handle:D: --> Bool:D)
multi  close(IO::Handle $fh)

关闭一个打开的文件句柄,如果成功,则返回 True。如果文件句柄已经关闭,则不会抛出错误,但如果你关闭了一个标准文件句柄(默认情况下:$*IN$*OUT$*ERR:任何具有 native-descriptor 2 或更低的文件句柄),你将无法重新打开它们。

given "foo/bar".IO.open(:w{
    .spurt: "I ♥ Raku!";
    .close;
}

使用 LEAVE phaser 来关闭句柄是一种常见的习惯用法,它确保无论如何离开块,句柄都会被关闭。

do {
    my $fh = open "path-to-file";
    LEAVE close $fh;
    # ... do stuff with the file 
}
 
sub do-stuff-with-the-file (IO $path-to-file{
  my $fh = $path-to-file.open;
 
  # stick a `try` on it, since this will get run even when the sub is 
  # called with wrong arguments, in which case the `$fh` will be an `Any` 
  LEAVE try close $fh;
 
  # ... do stuff with the file 
}

注意:与其他一些语言不同,Raku 不使用引用计数,因此文件句柄在超出范围时不会关闭。虽然它们会在垃圾回收时关闭,但不能保证垃圾回收会运行。这意味着你必须对打开用于写入的句柄使用显式的 close,以避免数据丢失,并且建议对打开用于读取的句柄也使用显式的 close,以便你的程序不会同时打开太多文件,从而在进一步的 open 调用时触发异常。

请注意,一些方法允许提供 :close 参数,以便在方法调用的操作完成后关闭句柄。作为一种更简单的替代方法,IO::Path 类型提供了许多读写方法,这些方法允许你在不直接处理文件句柄的情况下使用文件。