¿Cuál es la diferencia entre dos asignaciones de campo de este tipo? En realidad, la primera forma parece muy legible, pero me encuentro con la segunda forma en muchos ejemplos de código.
¿Hay alguna razón especial?
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 } }La diferencia es el tipo de retorno del schema de función.
La primera forma devuelve Unit .
La segunda forma devuelve el tipo de lo this está en el ámbito actual. En su caso, la segunda forma devolverá el tipo de inicio de Login , por lo que la instancia de esta clase.
El segundo enfoque es más idiomático en los casos en que está "configurando un objeto". De los documentos de Kotlin sobre la aplicación
El caso común de apply es la configuración del objeto. Dichas llamadas se pueden leer como "aplicar las siguientes asignaciones al objeto [y devolver el objeto mismo]".
Una de las razones por las que el segundo enfoque es útil es porque hace posible el encadenamiento de llamadas. El término general para este tipo de encadenamiento de método "devolver esto" es "interfaz fluida" .
val login = Login() .schema("...") .anotherFunctionOnLoginClass(...) .moreCallChaining(...) Una nota adicional: el this usado dentro de apply lambda no es necesario, porque apply ya this establece como Receiver . El código podría simplificarse a
fun schema(schema: String) = apply { grantToken.schema = schema }