J'ai deux propriétés float nullables et je veux les soustraire:
operator fun Float?.minus(dis2: Float?): Float { return this - dis2 }
J'ai créé cette fonction d'extension. Mais ça va en boucle infinie:
val dis1: Float? = 10.0f val dis2: Float? = 5.0f val value = dis1 - dis2
4 Réponses :
vous ne faites rien sauf appeler l'opérateur moins c'est ainsi que vous obtenez une boucle infinie
faire une vérification nulle et appeler l'opérateur moins par défaut de Float
val dis1: Float? = 10.0f val dis2: Float? = 5.0f operator fun Float?.minus(dis2: Float?): Float { return (this ?: 0f) - (dis2 ?: 0f) val value = dis1 - dis2
La principale raison pour laquelle j'ai créé cette fonction d'extension n'est pas d'utiliser l'assertion. Une meilleure solution?
c'est bizarre si vous ne voulez pas faire une assertion alors qu'espérez-vous être le résultat de null -1.0f ou 7.0f - null? la signature de votre opérateur renvoyant un Float
Vous pouvez simplement retourner 0 si la valeur est null
pour éviter une KotlinNullPointerException
. Dans votre méthode:
fun minus(value1: Float?, value2: Float): Float{ val firstValueHelper = value1 :? 0f val secondValueHelper = value2 :? 0f return firstValueHelper - secondValueHelper }
Simple que vous pouvez utiliser
operator fun Float?.minus(dis2: Float?): Float { return (this ?: 0f) - (dis2 ?: 0f) }
?: vérifie si la valeur est présente sinon alors il affecte la valeur par défaut
Mais ça va en boucle infinie
Votre extension se déroule en boucle infinie car dans le type de retour, vous appelez à nouveau - (Moins) sur deux flottants Nullable.
Les autres réponses sont bonnes si vous voulez null - null = 0
mais si le cas est que vous voulez null - null = null
vous avez besoin de quelque chose de légèrement différent.
Si le comportement souhaité est:
10 - 5 = 5
10 - null = 10
null - 5 = -5
null - null = null
puis utilisez ce qui suit
operator fun Float?.minus(other: Float?): Float? { return if (this == null && other == null) { null } else { (a ?: 0f) - (b ?: 0f) } }
Notez que l'addition peut être réalisée de la même manière