如何在 Kotlin 中为构造函数隐式传递上下文



我正在尝试根据定义类的范围构造类的实例,而无需使用显式参数。

这是从 Python 到 Kotlin 的移植的一部分,但主要思想是这样的:

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

在此示例中,d构造函数将使用默认上下文, a构造函数将使用contextAForScope,构造函数将使用contextBForScope b构造函数将使用(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 将 lambda 作为参数,该 lambda 中的所有内容仅在该范围内定义。

相关内容

  • 没有找到相关文章

最新更新