2016-08-19 7 views
3

Я пытаюсь закодировать 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; 

Эхо-серверы работают нормально; тестируется с помощью «nc»;

Проблема $myID становится 2 после того, как создаются обещания, и я не могу сказать, какое обещание выполняет текущее эхо. Похоже, что все обещания используются $myID; есть ли способ создать переменные, характерные для индивидуального обещания?

ответ

3

Вам не обязательно иметь $myID. Вы можете просто использовать $index в обещании, потому что он уже был привязан к блоку цикла. Вот рабочая модификация (..с строга):

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

Спасибо Тимбус! Советы приняты! – lisprogtor

7

Это одна из вещей, которые вы «проиграли», перейдя с no strict.

Что вам нужно, это лексическое определение. Используя my, вы получите переменную при каждом вводе блока ({ ... }).

Если вы сделаете это:

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

$myID Тогда будет локальным для start блока, и каждый раз, когда этот блок называется, он будет помнить его идентификатор. Таким образом, вы получите правильный идентификатор, когда сокет получает данные.

+2

Спасибо, Вен. Ты помог мне решить эту проблему. Еще раз спасибо ! Я попытаюсь использовать «мой» чаще :-) – lisprogtor

+1

@lisprogtor: Примите решение, решив проблему. – zb226

+0

Спасибо zb226! Ответ принят! – lisprogtor

Смежные вопросы