Как передать контекст Неявно для конструкторов в Котлине

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

Это часть порта от Python до Kotlin, но основная идея будет примерно такой:

var d = MyClass() use_scope(contextAForScope) { var a = MyClass() use_scope(contextBForScope) { var b=MyClass() } } 

В этом примере d конструктор будет использовать контекст по умолчанию, конструктор будет использовать contextAForScope а b конструктор будет использовать contextBForScope (здесь используется contextBForScope use_scope) . Что-то вроде неявных контекстов?

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

     class MyClass(val context: Int) fun MyClass() = MyClass(0) interface MyClassScope { fun MyClass(): MyClass } object ContextAForScope : MyClassScope { override fun MyClass() = MyClass(1) } object ContextBForScope : MyClassScope { override fun MyClass() = MyClass(2) } inline fun useScope(scope: MyClassScope, block: MyClassScope.() -> Unit) { scope.block() } fun main(args: Array<String>) { val d = MyClass() useScope(ContextAForScope) { val a = MyClass() useScope(ContextBForScope) { val b = MyClass() } } } 

    Используйте фабричную функцию для создания своего класса. Если вы называете функцию подобно классу, она выглядит как конструктор.

    Определите интерфейс с той же заводской функцией и два объекта для областей.

    Определите функцию, которая принимает область действия и блок инициализатора.

    Теперь вы можете использовать useScope -Function и внутри блока вызывается правильная фабричная функция.

    with вы ищите:

     class MyClass() var d = MyClass() fun main(args: Array<String>){ var c = "c: Could be any class" var d = "d: Could be any class" with(c) { // c is "this" var a = MyClass() print(c) // prints "c: Could be any class" with(d) { // d is "this" var b = MyClass() } // b is undefined in this scope } // a is undefined in this scope } 

    with принимает лямбда как аргумент, все, что лямбда определяется только в этой области.