Является ли Scala ExecutionContext как параметр Class или Method более идиоматическим? - PullRequest
2 голосов
/ 08 ноября 2019

Это больше идиоматический Scala для передачи ExecutionContext для каждого метода, например

class Foo {
    def bar(a: Int, b: Int)(implicit ec: ExecutionContext): Future[Int] = {
        Future(a + b)
    }

    def baz(a: Int, b: Int)(implicit ec: ExecutionContext): Future[Int] = {
        Future(a - b)
    }
}

или лучше для передачи ExecutionContext для класса, такого как

class Foo(implicit ec: ExecutionContext) {
    def bar(a: Int, b: Int): Future[Int] = {
        Future(a + b)
    }

    def baz(a: Int, b: Int): Future[Int] = {
        Future(a - b)
    }
}

Является ли один стиль обычно более предпочтительным в мире Scala, потому что он вызывает меньше сюрпризов, его легче читать или по другим причинам? Пожалуйста, дайте несколько ссылок, если это возможно.

1 Ответ

5 голосов
/ 08 ноября 2019

Две опции имеют разную семантику, поэтому ни одна из них не является идиоматической.

Первая опция позволяет вызывающей стороне указывать контекст выполнения во время вызова и позволяет использовать разные контексты для разных вызовов.

Второй вариант требует, чтобы один и тот же контекст использовался для всех вызовов.

Выбор зависит от семантики, которую вы хотите для своего класса и методов.

...