Więc zdefiniowano powiedzieć słowo:Jak sprawdzić, czy zmienna implementuje interfejs w clojure?
(def a :hello)
jak mogę sprawdzić, że implementuje interfejs IFN?
Więc zdefiniowano powiedzieć słowo:Jak sprawdzić, czy zmienna implementuje interfejs w clojure?
(def a :hello)
jak mogę sprawdzić, że implementuje interfejs IFN?
W ogólnym przypadku można użyć instance?
predykat:
(instance? <class-or-interface> <object>)
Cytowanie dokumentację:
(instance? c x)
ocenia x i testy jeśli jest instancją klasy C. Zwraca true lub false.
Na przykład:
(instance? java.lang.String "test")
> true
(instance? java.io.Serializable "test")
> true
Dla kodu w pytaniu, czy coś w tym rodzaju:
(instance? package.of.IFn a)
Albo, jak zostało wskazane w komentarzach, bo bardzo specyficzny przypadek pytania, czy a
jest instancją IFn
, to zadziała:
(ifn? a)
Jeszcze lepiej, użyj '(ifn? A)'. –
@DaveRay Jak to jest? Nie wiedziałem, że interfejs automatycznie pochodzi z predykatem testowania, gdzie jest to wyjaśnione w dokumentacji? czy działa dla interfejsów Java, takich jak 'Serializable'? –
Nie, nie ma generycznych predykatów dla każdego typu, ale pytanie, jak przetestować dla 'IFn', w takim przypadku,' ifn? 'Byłoby chyba bardziej idiomatyczne niż użycie' instancji? '. Podobnie, użyłbym 'string?' Zamiast twojego pierwszego przykładu. –
Dlaczego chcesz? Może to wskazywać na zepsuty projekt. –