Feaxer
@Feaxer
Программист-фрилансер

Можно ли в Котлине реализовать контекстные extension функции?

Например:
fun String.hello() = "world"

contextFunction {
println("".hello()) //Внутри contextFunction метод должен работать
}

println("".hello()) // А за пределами contextFunction он не должен существовать

Цель - добавить методы для стандартных типов, но только внутри dsl, чтобы не засорять этими методами глобальную область видимости.
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Kotlin
Android developer at Yandex
Можно, конечно. Нужно в качестве коллбека передать лямбду с ресивером. А внутри ресивера определить экстеншн.
object Ctx {
    fun String.hello() = "world"
}

fun contextFunction(block: Ctx.() -> Unit) {
    Ctx.block()
}

fun main(args: Array<String>) {
    contextFunction {
        println("".hello())
    }
}


Ещё можно упороться и добавлять функции в этот контекст извне. Не совсем обычным способом, но а что делать, если хочется странного.
val Ctx.hello2: String.() -> String get() = { "$this world" }

contextFunction{
   "hi".hello2()
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
iLLuzor
@iLLuzor
Java, Kotlin, Android Developer
Нет, это невозможно. И не понимаю, зачем это нужно.
Просто делайте dsl метод и передавайте в него ваш стринг(и\или что угодно ещё)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы