1

我使用 IntelliJ IDEA,但问题可能与其他 IDE 有关。有一种很好的方法可以使用 Ctrl+单击来导航代码。从方法调用它跳转到方法声明。它确实提高了生产力。

Actor 系统基于消息传递。使用 Scala 的 Akka 示例:

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:)会更合适。

如何在演员之间导航代码?

4

2 回答 2

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"
  }
}

现在,actor 处理消息的方式不同,具体取决于它之前处理的消息。这只是一个简单的例子——甚至可能从外部接收到实际的actor行为!

case class Behavior(receive: Actor.Receive)

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

另一个更大的困难是,您通常有一个ActorRef用于发送消息的地址!。这ActorRef与包含消息处理逻辑的actor类没有静态连接 - 它被实例化Props,可以使用任意代码来确定应该使用哪个actor类:

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提交功能请求。

于 2015-03-18T11:13:33.970 回答
3

并不完美,但对消息类型使用 Find Usage (Alt+F7) 会有所帮助。为此,您可能必须先导航到类型声明 (Ctrl+Shift+B)

我想知道是否有一种简单的方法可以为组合创建快捷方式。

另一个想法是使用结构搜索,它可能能够找到与类名匹配的表达式之类的东西......

根据自己的喜好创建模板后,您可以录制宏

于 2015-03-18T11:15:10.427 回答