Skip to content

Instantly share code, notes, and snippets.

@hyunjun
Created February 23, 2020 14:16
Show Gist options
  • Save hyunjun/637a2dcf575c914a2be1e5401395f687 to your computer and use it in GitHub Desktop.
Save hyunjun/637a2dcf575c914a2be1e5401395f687 to your computer and use it in GitHub Desktop.
scala concurrent
  • http://blog.madhukaraphatak.com/scala-magnet-pattern/ 에 따르면 정상 실행되야 하지만 나는 안 됨

    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
    import scala.concurrent.Future
    import scala.concurrent.Await
    import scala.concurrent.duration.Duration
    
    sealed trait FutureMagnet {
      type Result
    
      def apply() : Result
    }
    
    def completeFuture(magnet: FutureMagnet):magnet.Result = magnet()
    
    object FutureMagnet {
      implicit def intFutureCompleter(future:Future[Int]) = new FutureMagnet {
        override type Result = Int
    
        override def apply(): Result = Await.result(future,Duration.Zero)
      }
    
      implicit def stringFutureCompleter(future:Future[String]) = new FutureMagnet {
        override type Result = String
    
        override def apply(): Result = Await.result(future,Duration.Zero)
      }
    
    }
    
    
    scala> completeFuture( Future {1})
                                ^
         error: Cannot find an implicit ExecutionContext. You might pass
         an (implicit ec: ExecutionContext) parameter to your method.
    
         The ExecutionContext is used to configure how and on which
         thread pools Futures will run, so the specific ExecutionContext
         that is selected is important.
    
         If your application does not define an ExecutionContext elsewhere,
         consider using Scala's global ExecutionContext by defining
         the following:
    
         implicit val ec: scala.concurrent.ExecutionContext = scala.concurrent.ExecutionContext.global
    
  • method overload이 실패. 원인은 type erasure때문

    scala> import scala.concurrent.Future
    import scala.concurrent.Future
    
    scala> import scala.concurrent.Await
    import scala.concurrent.Await
    
    scala> import scala.concurrent.duration.Duration
    import scala.concurrent.duration.Duration
    
    scala> def completeFuture(value: Future[String]): String = Await.result(value, Duration.Zero)
    completeFuture: (value: scala.concurrent.Future[String])String
    
    scala> def completeFuture(value: Future[Int]): Int = Await.result(value, Duration.Zero)
    completeFuture: (value: scala.concurrent.Future[Int])Int
    
    scala> completeFuture(Future {1})
                               ^
         error: Cannot find an implicit ExecutionContext. You might pass
         an (implicit ec: ExecutionContext) parameter to your method.
    
         The ExecutionContext is used to configure how and on which
         thread pools Futures will run, so the specific ExecutionContext
         that is selected is important.
    
         If your application does not define an ExecutionContext elsewhere,
         consider using Scala's global ExecutionContext by defining
         the following:
    
         implicit val ec: scala.concurrent.ExecutionContext = scala.concurrent.ExecutionContext.global
    
    scala> completeFuture(Future {"Hello"})
                                ^
         error: type mismatch;
          found   : String("Hello")
          required: Int
    
  • ref; http://blog.madhukaraphatak.com/scala-magnet-pattern/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment