Context Receivers

06.10.2023https://www.droidcon.com/2023/10/06/getting-ready-for-kotlin-context-receivers/
26.03.2024https://habr.com/ru/companies/ozontech/articles/802641/

Новая функция, которая позволяет указывать несколько контекстов для функции или метода, предоставляя более гибкие возможности для создания функций, которым требуется доступ к нескольким внешним объектам или интерфейсам. Эта концепция особенно полезна, когда функции зависят от нескольких контекстов и вам нужно явно указать, какие контексты могут влиять на выполнение функции. Context Receivers позволяют вам определить несколько контекстов, необходимых для выполнения функции, и использовать их напрямую без явного указания в параметрах.

// Здесь performQueryWithLogging объявлена с двумя контекстными ресиверами: Database и Logger. 
// В теле функции вы можете использовать методы обоих объектов напрямую, не передавая их явно через параметры.

class Database {
    fun query(query: String): List<String> = listOf("Result 1", "Result 2")
}

class Logger {
    fun log(message: String) {
        println(message)
    }
}

// Функция зависит от двух контекстов: Database и Logger
context(Database, Logger)
fun performQueryWithLogging(query: String) {
    log("Executing query: $query")  // Вызов метода из Logger
    val result = query(query)       // Вызов метода из Database
    log("Query result: $result")    // Вызов метода из Logger
}

Kotlin Context Receivers. Вопросы на собесе
  1. Что такое Context Receivers в Kotlin и как они работают?
  1. Чем Context Receivers отличаются от традиционных способов передачи контекста, таких как параметры функции или использование with?