2016-08-19 47 views
3

我正在嘗試編碼運行在promise中的3個回顯服務器,但我想知道哪個承諾正在做迴應。有沒有辦法做到這一點?perl6如何獲得承諾的具體身份?

no strict; 

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

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

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

await @result; 

echo服務器運行正常;用「nc」進行測試;

問題是$myID在創建承諾後變成2,並且我無法分辨哪個承諾正在執行當前回顯。看來所有的承諾都使用$myID;有沒有一種方法可以創建特定於單個承諾的變量?

回答

3

根本不需要有$myID。您可以在promise中使用$index,因爲它已經被限制在循環塊中。這裏有一個工作改進(..with嚴格上):

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

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

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

await @result; 

隨着該照顧的感覺衝動指出,使用no strict顯得非常必要。這不僅會讓你打開這些奇怪的範圍問題,而且在你的例子中你完全沒有得到什麼。

對未修改的代碼重新啓用嚴格並修復兩個編譯錯誤顯示只保存了四個按鍵 - 代碼是無論您在此處用多少個鍵輸入您的問題。

+1

謝謝Timbus!建議採取! – lisprogtor

7

這就是你通過no strict去「輸」的東西之一。

你需要的是詞法範圍。每次輸入塊({ ... })時,使用my都會給您一個不同的變量。

如果你這樣做:

for 0 .. 2 -> $index { 
    @result[$index] = start { 
     my $myID = $index; 

然後$myID將是本地的start塊,每個該塊被調用時,它會記住它的ID時間。所以,只要套接字接收到數據,你就會得到正確的ID。

+2

謝謝你。你幫我解決了這個問題。再次感謝 !我會嘗試更頻繁地使用「我的」:-) – lisprogtor

+1

@lisprogtor:如果它解決了您的問題,請接受答案。 – zb226

+0

謝謝zb226!接受答案! – lisprogtor