2017-05-06 3 views
1

Si un KCallable est créé en utilisant Any()::toString, alors quand il est référencé plus tard, vous n'avez pas besoin de passer cette instance Any (lorsque vous utilisez call).Kotlin vérifier si la fonction nécessite le paramètre d'instance

Bien que si elle est créée en utilisant Any::toString (pas une instance de Any), il est nécessaire de passer une instance Any. Donc, ma question est comment puis-je facilement savoir si j'ai besoin de passer ce paramètre d'instance et ce paramètre est-il obligatoire?

J'ai trouvé une façon de le faire:

callable.parameters[0].kind == KParameter.Kind.INSTANCE

mais il est pas tout à fait agréable et je me demande s'il y a un moyen plus facile ou recommandé de résoudre ce problème. Merci!

Répondre

1

Une amélioration de la méthode proposée consiste à vérifier la propriété instanceParameter: si elle est non nulle, le appelable attend une instance:

val isInstanceCallable = callable.instanceParameter != null 

En outre, les fonctions d'extension comme fun Any.foo() = ... auront nulle dans le instanceParameter , et vous voudrez probablement vérifier le extensionReceiverParameter aussi bien.


En outre, si vous avez seulement besoin de travailler avec des références appelables, vous pouvez vérifier si elles ont un récepteur lié (à savoir l'instance qu'il est lié à). Utilisez la boundReceiver propriété:

val instance = (callable as CallableReference).boundReceiver 

Lorsqu'une référence appelable est non liée, elle retourne une valeur spéciale CallableReference.NO_RECEIVER donc il vous suffit de comparer la valeur retournée avec elle:

val bound = (callable as CallableReference).boundReceiver != CallableReference.NO_RECEIVER 

(runnable example)

+0

Donc, quand 'instanceParameter' renvoie null cela signifie que je n'ai pas besoin de passer le propriétaire appelable, non? – Mibac

+0

Presque. Il y a aussi des fonctions d'extension: 'fun Any.foo() = 1': il aura' instanceParameter == null', donc vous voudrez probablement aussi vérifier 'extensionReceiverParameter'. – hotkey