Así que he definido dicen una palabra clave:¿Cómo puedo verificar si una variable implementa una interfaz en clojure?
(def a :hello)
¿cómo puedo comprobar que implementa la interfaz IFn?
Así que he definido dicen una palabra clave:¿Cómo puedo verificar si una variable implementa una interfaz en clojure?
(def a :hello)
¿cómo puedo comprobar que implementa la interfaz IFn?
Para el caso general, se puede utilizar el predicado instance?
:
(instance? <class-or-interface> <object>)
Citando la documentación:
(instance? c x)
evalúa X y pruebas si es una instancia de la clase c. Devuelve verdadero o falso.
Por ejemplo:
(instance? java.lang.String "test")
> true
(instance? java.io.Serializable "test")
> true
Para el código en la pregunta, hacer algo como esto:
(instance? package.of.IFn a)
O, como se ha señalado en los comentarios, por las muy específicas caso de preguntar si a
es una instancia de IFn
esto funcionará:
(ifn? a)
Mejor aún, use '(ifn? A)'. –
@DaveRay ¿Cómo? No sabía que una interfaz viene automáticamente con un predicado de prueba, ¿dónde se explica esto en la documentación? funciona para interfaces Java, como 'Serializable'? –
No, no hay un predicado genérico para cada tipo, pero la pregunta es cómo probar 'IFn', en cuyo caso,' ifn? 'Supongo que sería más idiomático que usar' instance? '. Del mismo modo, utilizaría 'string?' En lugar de su primer ejemplo. –
¿Por qué quieres? Podría indicar un diseño roto. –