Что означает фигурная скобка после названия определения черты в scala? - PullRequest
0 голосов
/ 27 июня 2019

При использовании Future Я видел, как люди используют

Future{
      Thread sleep 500
      promise success "You've just completed the promise with me in it!"
 }

Глядя на определение Future, я вижу, что будущее - это черта

Но когда я создаю свою собственную черту, Пример:

trait t{}
def main(args: Array[String]): Unit = {
    t{
        println("Test")
    }
}

Не компилируется. Зачем?

Ответы [ 2 ]

4 голосов
/ 27 июня 2019

когда вы пишете Future{ /*your code*/ }, вызывается метод apply объекта-компаньона Future.

подпись Future метода применения следующая

def apply[T](body:=>T)

Вы можете видеть, что метод apply вызывается, когда вы делаете ctrl+click или cmd+click на Future в IDE, такой как InteliJ.

Ваша черта t не имеет применения. Поэтому этот фрагмент кода не компилируется.

trait t{}
object t{
  apply[T](body:=>T){}
}
2 голосов
/ 27 июня 2019

Синтаксис для Future, который вы описываете, происходит от объекта-компаньона trait.

Этот объект имеет следующий метод:

  def apply[T](body: =>T)(implicit @deprecatedName('execctx) executor: ExecutionContext): Future[T] =
    unit.map(_ => body)

Принятым аргументом является функция, возвращающая T, это прекрасноидиоматично передавать его через форму, которую вы видите, которая представляет собой блок кода в квадратных скобках.

При этом вы можете отчасти реализовать свои черты (создавая их анонимные подклассы) следующей компиляцией:

trait t {}

object MyApp extends App {
  new t {
    println("Test")
  }
}

Я бы не рекомендовал это как общую хорошую практику, но он имеет свои применения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...