在 IO::Socket 角色中§
请参阅主要文档 in context 了解方法 close
method close(IO::Socket)
关闭套接字。
如果套接字未连接,则失败。
在 Channel 中§
请参阅主要文档 in context 了解方法 close
method close(Channel:)
正常关闭Channel
。这会导致后续的send
调用使用 X::Channel::SendOnClosed
终止。后续的.receive
调用仍然可以消耗任何先前发送的剩余项目,但如果队列为空,则会抛出 X::Channel::ReceiveOnClosed
异常。由于您可以通过使用@()
将上下文设置为数组或调用.list
方法从Channel
生成 Seq
,因此这些方法在Channel
关闭之前不会终止。whenever
块也会在关闭的Channel
上正确终止。
my = Channel.new;.close;.send(1);CATCH ;# 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)
关闭管道并返回管道从中派生的 Proc
对象。
在 IO::Socket::Async 中§
请参阅主要文档 in context 了解方法 close
method close(IO::Socket::Async: )
关闭已从listen
Supply
或connect
Promise
获得的已连接客户端IO::Socket::Async
。
为了关闭由listen
创建的底层侦听套接字,您可以close
IO::Socket::Async::ListenSocket
。有关示例,请参阅 listen。
在 Tap 中§
请参阅主要文档 in context 了解方法 close
method close(Tap:)
关闭水龙头。
在 IO::CatHandle 中§
请参阅主要文档 in context 了解方法 close
method close(IO::CatHandle: --> True)
关闭当前活动的源句柄以及任何已打开的源句柄,并清空源句柄队列。与常规 IO::Handle
不同,在 IO::CatHandle
上通常不需要显式调用 .close
,因为仅仅耗尽所有输入就会关闭所有需要关闭的句柄。
with IO::CatHandle.new:
在 IO::Handle§
有关例程 close,请参阅 上下文中的主要文档
method close(IO::Handle: --> Bool)multi close(IO::Handle )
关闭一个打开的文件句柄,如果成功,则返回 True
。如果文件句柄已经关闭,则不会抛出错误,但如果你关闭了一个标准文件句柄(默认情况下:$*IN
、$*OUT
或 $*ERR
:任何具有 native-descriptor 2
或更低的文件句柄),你将无法重新打开它们。
given "foo/bar".IO.open(:w)
使用 LEAVE
phaser 来关闭句柄是一种常见的习惯用法,它确保无论如何离开块,句柄都会被关闭。
dosub do-stuff-with-the-file (IO )
注意:与其他一些语言不同,Raku 不使用引用计数,因此文件句柄在超出范围时不会关闭。虽然它们会在垃圾回收时关闭,但不能保证垃圾回收会运行。这意味着你必须对打开用于写入的句柄使用显式的 close
,以避免数据丢失,并且建议对打开用于读取的句柄也使用显式的 close
,以便你的程序不会同时打开太多文件,从而在进一步的 open
调用时触发异常。
请注意,一些方法允许提供 :close
参数,以便在方法调用的操作完成后关闭句柄。作为一种更简单的替代方法,IO::Path
类型提供了许多读写方法,这些方法允许你在不直接处理文件句柄的情况下使用文件。