gpt4 book ai didi

class - Kotlin 类中的初始化 block 位置

转载 作者:行者123 更新时间:2023-12-02 12:15:40 25 4
gpt4 key购买 nike

我最近遇到了一种情况,即使我使用 init 块为构造函数分配了一个值,我的标准变量的值也会被默认值替换。

我尝试的是:

class Example(function: Example.() -> Unit) {

init {
function()
}

var name = "default name"

}


// assigning it like this:
val example = Example { name = "new name" }

// print value
print(example.name) // prints "default name"

经过一番挣扎,我发现 init 块的位置很重要。如果我将 init 块放在类的最后一个,它首先使用默认名称初始化名称,然后调用 function() 将值替换为“新名称”。

如果我把它放在第一位,它没有找到名称,并且在初始化属性时将其替换为“默认名称”。

这对我来说很奇怪。谁能解释为什么会这样?

最佳答案

原因是 kotlin 遵循 自上而下的 方法

从文档 (An in-depth look at Kotlin’s initializers) 中,初始化器(属性初始化器和 init 块)按照它们在 从上到下 类中定义的顺序执行。

您可以定义多个辅助构造函数,但在创建类实例时只会调用一个,除非构造函数显式调用另一个。

构造函数也可以有默认参数值,每次调用构造函数时都会对其进行评估。与属性初始值设定项一样,它们可以是函数调用或将运行任意代码的其他表达式。

初始化器在类的主构造函数的开头从上到下运行。

这是正确的方法

class Example(function: Example.() -> Unit) {
var name = "default name"
init {
function()
}
}

关于class - Kotlin 类中的初始化 block 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47447842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com