gpt4 book ai didi

sockets - perl6 去年以来 IO::Socket::INET 的变化和违背 promise

转载 作者:行者123 更新时间:2023-12-03 11:51:43 26 4
gpt4 key购买 nike

去年我问了一个关于 Promise 的问题时,我的 echo 服务器正在工作(请参阅此链接:perl6 how to get specific identity of promises?)。但是,使用新版本的 perl6,我的 echo 服务器不再工作。

我想我可以尝试 perl6 文档站点 (https://docs.perl6.org/type/IO::Socket::INET) 中的示例,但我想找出我在代码中犯了什么错误。我目前的水平使我无法看到我的代码与 perl6 文档站点上的代码之间的差异。请给我一个提示;谢谢 !

my @result;

for 0 .. 2 -> $index {
@result[$index] = start {
my $myPromiseID = $index;
say "======> $myPromiseID\n";

my $rsSocket = IO::Socket::INET.new:
localhost => 'localhost',
localport => 1234 + $index,
listen => 1;

while $rsSocket.accept -> $rsConnection {
say "Promise $myPromiseID accepted connection";
while $rsConnection.recv -> $stuff {
say "Promise $myPromiseID Echoing $stuff";
$rsConnection.print($stuff);
}
$rsConnection.close;
}
}
}

await @result;

错误消息是:
Tried to get the result of a broken Promise
in block <unit> at p6EchoMulti.pl line 24

Original exception:
Nothing given for new socket to connect or bind to
in block at p6EchoMulti.pl line 8

Actually thrown at:
in block at p6EchoMulti.pl line 13

最佳答案

This commit ,即 announced in the Jan 2017 section of Rakudo's changelog因为“修复了未正确解析 IPv6 URI 的错误”所做的更多只是修复了 URI 解析错误。它还完全重做了 IO::Socket::INET.new 的参数绑定(bind)/验证。调用,结果之一是它破坏了您的代码,因为更新的代码要求 listen做一个真正的Bool ,而不仅仅是强制一个。

旧代码(上面提交链接左侧的代码)有一个简单的 method new (*%args is copy) .这符合您的要求。错误 ( fail "Nothing given for new socket to connect or bind to" ) 没有触发,因为 1计算结果为 True在 bool 上下文中,所以 %args<host> || %args<listen>也是True .所以剩下的代码用 listen 运行。设置为 1一切都很好。

来自 2017.01 的 Rakudos 在上面的提交链接中有右侧的代码。注意现在有多个 new方法(即多个 multi method new ... 声明)。

用于处理指定 listen 的调用的 multi(s)参数是/是形式multi method new (..., Bool:D :$listen!, ...) .注意 Bool:D .

调用 new , 与 listen参数设置为 True , 匹配这个 multi 并按预期工作。

但是调用 :listen(1)只会匹配通用 multi method new (*%args)而是签名。后者执行无条件 fail "Nothing given for new socket to connect or bind to"; .

关于sockets - perl6 去年以来 IO::Socket::INET 的变化和违背 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45788555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com