invoke 和 init kotlin 之间的区别

difference between invoke and init kotlin

我正在研究 kotlin 中的运算符重载,我 运行 进入了 invoke 方法。当我对它进行研究时,我发现它的工作方式与每个 class 的 init 构造函数非常相似。 我无法理解其中的区别,它们看起来很相似,因为我们在 invoke 方法中所做的一切,也可以在 init 构造函数中完成。

那么它们有什么区别,我们应该在什么时候使用它们?

这不是一个很好的比较。每次实例化 class 时,init 块都是 运行,我们将在接下来看到任何类型的构造函数。但是 invoke 方法可以被调用多次,就像 class 的任何其他方法一样。 假设您想要 return 一个 class 的所有值作为代码不同部分中的字符串。您可以在invoke中实现它,并在任何需要的地方调用它而无需命名函数。

示例:

class Person(val name :String,var age:Int) {
    
    fun incrementAge(){
        age =age + 1   
    }

    operator fun invoke():String {
        
        return "name: $name \nage:  $age\n"
    }
}

fun main() {
    
    val x = Person("lionel",35)
    println(x())
    x.incrementAge()
    println(x())
}

输出:

name: lionel 
age:  35

name: lionel 
age:  36