2015-03-18 3 views
0

Я использую IntelliJ IDEA, но вопрос может быть связан с другими IDE. Существует отличный способ навигации по коду с помощью Ctrl + click. По вызову метода он переходит к объявлению метода. Это действительно повышает производительность.Перемещение кода актерской системы в Intellij IDEA

Системы актеров основаны на передаче сообщений. Пример в Акку с Scala:

class MyMessage 
object MyMessage 

class MyActor1 extends Actor { 
    context.actorOf(Props[MyActor2]) ! MyMessage 
} 

class MyActor2 extends Actor { 
    def receive = { 
    case MyMessage => 
     ... 
    } 
} 

Есть ли способ навигации в коде между отправкой сообщения и получения сообщения?

Я имею в виду, что нажатие на ! приведет меня к определению метода ! в ScalaActorRef, но это 99% шанс, что я этого не хочу. Было бы более подходящим перейти к соответствующему методу приема (или, если возможно, исправить случай: case MyMessage).

Как сделать вы перейдите код между участниками?

+0

Вам, вероятно, потребуется получить доступ к типу актера, используя ctrlclicking используемую вами переменную! on (перейти к определению), ctrlclick тип реквизита и выполнить поиск метода получения. Как уже упоминалось, может быть более одного. –

ответ

3

Я не думаю, что это возможно вообще, потому что актер может изменить свое поведение во время выполнения, включая сообщения, которые он может обрабатывать, в отличие от методов, которые можно статически индексировать. Например, функция приема может быть вычислена в зависимости от состояния актера:

class MyActor extends Actor { 
    var i = 0 

    def receive = firstReceive 

    def commonReceive = { 
    case Increment => 
     i += 1 
     if (i % 3 == 0) context.become(firstReceive) 
     else context.become(secondReceive) 
    } 

    def firstReceive = commonReceive orElse { 
    case Ping => 
     sender ! "zero" 
    } 

    def secondReceive = commonReceive orElse { 
    case Ping => 
     sender ! "one or two" 
    } 
} 

Теперь актер обрабатывает сообщения по-разному в зависимости от того, какие сообщения он обрабатываемые раньше. И это всего лишь простой пример - реальное поведение актера может даже быть получено извне!

case class Behavior(receive: Actor.Receive) 

class MyActor extends Actor { 
    def receive = { 
    case Behavior(r) => context.become(r) 
    } 
} 

Еще одна трудность, которая еще больше в том, что вы обычно имеют ActorRef, к которому вы отправляете сообщения с !. Это ActorRef не имеет статическую связи с классом актера, который содержит обработку сообщений логики - это экземпляр с Props, который может использовать произвольный код чтобы определить, какой актер класс должно быть использовано:

val r = new Random 
val a = actorSystem.actorOf(Props(if (r.nextInt(100) > 50) new FirstActor else new SecondActor)) 
a ! Message // which handler should this declaration lead to? 

Это делает поиск фактического обработчика сообщений рядом невозможно.

Если вы считаете, что это может стоить того, чтобы поддерживать более простые случаи, например, тот, который вы предоставили, вы всегда можете отправить запрос функции на YouTrack.

3

Не идеально, но что могло бы помочь использовать поиск (Alt + F7) для типа сообщения. Для этого вам, вероятно, придется сначала перейти к объявлению типа (Ctrl + Shift + B)

Интересно, есть ли простой способ создать ярлык для этой комбинации.

Другой идеей было бы использовать Structural Search, которые могли бы быть в состоянии найти такие вещи, как excpressions, что матч на имя класса ...

После того, как вы создали шаблон по своему вкусу вы можете затем record a macro

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

  • Нет связанных вопросов^_^