2017-08-21 51 views
2

當我在去年問一個有關promise的問題時,我的echo服務器正在工作(請參閱此鏈接:perl6 how to get specific identity of promises?)。但是,在新版本的perl6中,我的回顯服務器不再工作。perl6從上一年的IO :: Socket :: INET中的更改和違反承諾

我想我可以嘗試從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 

回答

2

This commit這是announced in the Jan 2017 section of Rakudo's changelog作爲「解決了IPv6 URI未被正確解析的問題」做了很多工作,只是解決了一個URI解析錯誤。它還完全重新調用了IO::Socket::INET.new調用的參數綁定/驗證,其中一個後果是它破壞了您的代碼,因爲更新的代碼要求listen是實際的Bool,而不僅僅是脅迫其中一個。


舊代碼(上面的提交鏈接左側的代碼)進行了簡單的method new (*%args is copy)。這匹配你的電話。錯誤(fail "Nothing given for new socket to connect or bind to")未觸發,因爲1在布爾上下文中計算爲True,所以%args<host> || %args<listen>也是True。因此,其餘的代碼運行listen設置爲1,它都運行良好。

2017.01的Rakudos在上面的提交鏈接右側有代碼。請注意現在有多個new方法(即多個multi method new ...聲明)。

旨在處理指定listen參數的調用的多個/的格式爲multi method new (..., Bool:D :$listen!, ...)。請注意0​​。

的調用new,與listen參數設置爲True,匹配這個多和按預期工作。

但是撥打:listen(1)的電話將與通用的multi method new (*%args)簽名相匹配。後者做了無條件的fail "Nothing given for new socket to connect or bind to";

+1

謝謝你raiph!你已經多次幫助我了,如果我們在perl6會議上見面,我會給你買一杯咖啡.-) – lisprogtor

+1

FWIW,我會將它歸類爲一個錯誤。簽名可能應該是'Bool(任何)',又名'將任意'對象強制轉換爲'Bool'。另一方面,只需指定':listen'就足夠了,因爲它與'listen = > True' –

+0

@lisprogtor這是一個很好的評論。在這種情況下,我在睡覺之前就發現了你的問題。但是請知道,你的問題可能會在#perl6上更快和/或有幫助地得到解答,這是一個友好的頻道,您可以在這裏聊天聊天,看看日食或任何非常棒的食物。見https://perl6.org/community/irc或[只需點擊此處](http://webchat.freenode.net/?channels=perl6&nick=lisprogtor)並輸入「hi」。根據時間的不同,有些人可能會在幾分鐘內回覆,你可以分享一個虛擬的茶杯。 :) – raiph

1

好,有些掙扎之後,似乎如果我改變了聽=> 1聽=>真有所改善。

任何人都可以關心解釋爲什麼1沒有被評估爲真,以及爲什麼它以前工作?

謝謝。