通过作用域函数进行 Kotlin 字段赋值(Apply)

Ahm*_*aya 3 kotlin

两次这样的现场作业有什么区别?实际上,第一种方法看起来非常可读,但我在许多代码示例中遇到了第二种方法。

有什么特殊原因吗?

class Login {

    var grantToken = GrantTokenRequest()
 
    fun schema(schema: String) {
        this.grantToken.schema = schema
    }
    
}




class Login {

    var grantToken = GrantTokenRequest()

    fun schema(schema: String) = apply { this.grantToken.schema = schema }
   

}
Run Code Online (Sandbox Code Playgroud)

Ma3*_*a3x 5

区别在于函数的返回类型schema

\n

第一种方式返回Unit

\n

第二种方法返回当前范围内的类型this。\n在您的情况下,第二种方法将返回类型Login,即此类的实例。

\n

当您“配置对象”时,第二种方法更为惯用。来自Kotlin 文档关于 apply

\n
\n

apply 的常见情况是对象配置。此类调用可以读作\xe2\x80\x9c将以下赋值应用于对象[并返回对象本身]。\xe2\x80\x9d

\n
\n

第二种方法有用的原因之一是它使调用链成为可能。这种“返回此”方法链的总称是“流畅接口”

\n
val login = Login()\n    .schema("...")\n    .anotherFunctionOnLoginClass(...)\n    .moreCallChaining(...)\n\n
Run Code Online (Sandbox Code Playgroud)\n

附加说明:不需要在 lambdathis内部使用,因为 apply 已经设置为Receiver。代码可以简化为applythis

\n
fun schema(schema: String) = apply { grantToken.schema = schema }\n
Run Code Online (Sandbox Code Playgroud)\n