Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

223
Visualizações
¿Es posible anular T o 'esto' al final de la función genérica para Kotlin?

Tengo en mi proyecto un oyente. Se asigna a drawerLayout . Me gustaría en la función lambda eliminarlo y anularlo de una vez (secuencialmente). ¿Es posible anular T o this al final de la función genérica?

Aquí está mi código:

 // Usage actionBarListener?.let { drawerLayout.removeDrawerListener(it) // remove listener actionBarListener = null // null it } // Usage expected actionBarListener.releaseAndSetNull { drawerLayout.removeDrawerListener(it) // remove listener and null it } // Generic fun <T> T?.releaseAndSetNull(block: (T?) -> Unit) = apply { this?.apply { block.invoke(this) } this = null // Error: variable expected }
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Puedo pensar en varias razones por las que esto nunca podría funcionar.

En primer lugar, la función genérica no sabe si this trata de var o val . Y esta funcionalidad solo podría funcionar en una var

Del mismo modo, no puede saber si es anulable, eso también es un requisito.

Además, incluso puede darse el caso de que no sea una variable la que esté llamando a la función.

como decir que tienes

 fun getActionBarListener() { return actionBarListener }

Entonces en otro lugar podrías hacer

 getActionBarListener().releaseAndSetNull { drawerLayout.removeDrawerListener(it) // remove listener and null it }

¿Cómo esperas que funcione?

O incluso objetos anónimos podrían llamar a esta función.

over 4 years ago · Santiago Trujillo Relatório

0

Como dijo Ivo Beckers, esta función solo funcionaría en var s, es decir, KMutableProperty0<T> . Entonces, podría escribir una extensión en KMutableProperty0<T?> y usar la reflexión para configurarla, si no le importa usar la reflexión, eso es.

 inline fun <T: Any> KMutableProperty0<T?>.releaseAndSetNull(block: (T?) -> Unit) { block(this.get()) this.set(null) } // or if you don't want the block to be called if the property is null: inline fun <T: Any> KMutableProperty0<T?>.releaseAndSetNull(block: (T) -> Unit) { this.get()?.run(block) this.set(null) }

Entonces suponga que tiene una propiedad:

 var foo: Int? = 10

Tu puedes hacer:

 ::foo.releaseAndSetNull { println("Foo: $it") } // or if foo belongs to someObject someObject::foo.releaseAndSetNull { println("Foo: $it") }

Mirando el código de bytes generado, la forma en que esto se implementa (que está sujeto a cambios) es que cada propiedad única a la que hace referencia una referencia de propiedad de esta manera hace que se genere una clase interna. La clase interna tendrá métodos get y set que harán su trabajo con un costo adicional mínimo, ya que pueden establecer la propiedad correcta directamente . Entonces, realmente el costo principal es la clase interna adicional que se genera.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda