【问题标题】:difference between invoke and init kotlin调用和初始化 kotlin 的区别
【发布时间】:2021-09-23 04:56:46
【问题描述】:

我正在研究 kotlin 中的运算符重载,我遇到了invoke 方法。当我对它进行研究时,我发现它与每个类的 init 构造函数非常相似。 我无法理解差异,它们似乎很相似,因为我们在 invoke 方法中所做的一切,也可以在 init 构造函数中完成。

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

【问题讨论】:

  • 我不明白你的意思“我们在调用方法中所做的一切,都可以在 init 构造函数中完成”。 invoke 是一个方法(恰好也是一个运算符),init 是一个初始化块——它们没有任何共同之处。我认为您的问题是缺乏阅读文档和尝试代码的投资
  • @Neo 我不知道你从我的问题中得到了什么,但我并没有询问结构。我问每个的用途是什么。
  • invoke 可用于 lambdas,尤其是可空 lambdas 以使用所需参数调用主体,而 init 是在类的构造函数调用之后调用的块,以创建对象以初始化某些属性或做其他事情。不知道你为什么对它们感到困惑。

标签: android kotlin operator-overloading invoke init


【解决方案1】:

这不是一个很好的比较。每次实例化类时都会运行init 块,我们将在下面看到任何类型的构造函数。但是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

【讨论】:

  • 感谢您的回答。不只是我,我看到多个学生问我的问题而没有得到任何答案。我很困惑,因为我认为只要实例化结果就会出现,但现在我完全明白了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多