Akka 코드에 나타나는진면목

11030 단어 ScalaAkkatech
안녕하세요, 저는 프라하의 엔지니어 곡전입니다.
최근 능동적인 구조에 열중하고 있기 때문에 오늘은 아카의 입문 기사를 쓰고 싶습니다.

대상 독자

  • 최근 Akka
  • 배우기 시작
  • Scara도 별로 안 읽어봤어요
  • 이번 해설 코드.


    다음 반응기를 정의했습니다.
    import akka.actor.typed.{ActorRef, Behavior}
    import akka.actor.typed.scaladsl.{AbstractBehavior, ActorContext, Behaviors}
    
    object TestActor {
      def apply(): Behavior[Command] =
        Behaviors.setup(context => new TestActor(context))
    
      sealed trait Command
    
      final case class Greet(message: String, replyTo: ActorRef[Respond]) extends Command
      final case class Respond(message: String)
    }
    
    class TestActor(context: ActorContext[TestActor.Command])
      extends AbstractBehavior[TestActor.Command](context) {
      import TestActor._
    
      override def onMessage(msg: Command): Behavior[Command] =
        msg match {
          case Greet(message, replyTo) =>
            replyTo ! Respond(message)
            this
        }
    }
    
    이쪽 반응기로 테스트를 쓸게요.
    import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit
    import org.scalatest.wordspec.AnyWordSpecLike
    
    class TestActorSpec
      extends ScalaTestWithActorTestKit with AnyWordSpecLike  {
      import TestActor._
    
      "Test Actor" must {
        "メッセージを受信すると、そのまま返す" in {
          val probe = createTestProbe[Respond]()
          val testActor = spawn(TestActor())
          testActor ! Greet("hogehoge", probe.ref)
          val response = probe.receiveMessage()
          response.message should be("hogehoge")
        }
      }
    }
    
    여러분은 상술한 테스트 코드를 읽을 때 바로 이해하셨습니까?
    내가 처음에 이해할 수 있는 건 "아~ 이러면 배우한테 문자를 보낸구나~"
    testActor ! Greet("hogehoge", probe.ref)
    
    이 글에서 우리는 이 줄이 도대체 무엇을 하고 어떤 구조로 행동하는지 설명할 것이다.

    ! 진면목


    후딱후딱라고 원형으로 설명하면 단순한'방법'에 불과하다.
    하지만 방법은
    testActor.!(Greet("hogehoge", probe.ref))
    
    이렇게 부르는 거 아니에요?내 생각엔 그렇지?
    (내 생각엔)

    !정의


    IntelliJ를 사용하는 사람은 Cmd+b로 점프를 시도해 보세요.
    다음 정의로 이동한 것 같습니다.
    object ActorRef {
    
      implicit final class ActorRefOps[-T](val ref: ActorRef[T]) extends AnyVal {
    
        /**
         * Send a message to the Actor referenced by this ActorRef using *at-most-once*
         * messaging semantics.
         */
        def !(msg: T): Unit = ref.tell(msg)
      }
    }
    
    좋아!메소드로 정의!

    왜 특별한 호칭이 있을까요?


    이는 Scara가 이렇게 쓸 수 있는 언어 규범이기 때문이다.
    아마 Scara를 쓸 줄 아는 사람은 이미 알았겠지만, 나는 최근까지도 몰랐어!
    scala에서 아래의 명칭은 모두 같은 동작이다
    // いわゆる一般的な書き方
    testActor.!(Greet("hogehoge", probe.ref))
    // . を省略できる
    testActor !(Greet("hogehoge", probe.ref))
    // 引数の()を省略できる
    testActor ! Greet("hogehoge", probe.ref)
    

    총결산


    이번에도 저와 마찬가지로 아카와 스칼라가 최근에 공부를 시작했어요!이런 분들에게 참고가 됐으면 좋겠다고 생각해서 기사를 썼어요.
    또 현재 회사 밖 사람들과 함께 아카카 실천성경 윤독회를 열고 있습니다!
    그런 계기로 악카 공부를 시작해볼까요?이런 생각을 가진 여러분, 윤독회에 꼭 참가하세요!
    관심 있으면 이 글에 메모를 남기고 DM이 오기를 기다리세요!

    좋은 웹페이지 즐겨찾기