如何检查变量是否在clojure中实现接口?

zca*_*ate 7 clojure

所以我定义了一个关键字:

(def a :hello)
Run Code Online (Sandbox Code Playgroud)

我如何检查它是否实现了IFn接口?

Ósc*_*pez 15

对于一般情况,您可以使用instance?谓词:

(instance? <class-or-interface> <object>)
Run Code Online (Sandbox Code Playgroud)

引用文档:

(instance? c x)评估x并测试它是否是类c的实例.返回true或false.

例如:

(instance? java.lang.String "test")
> true

(instance? java.io.Serializable "test")
> true
Run Code Online (Sandbox Code Playgroud)

对于问题中的代码,请执行以下操作:

(instance? package.of.IFn a)
Run Code Online (Sandbox Code Playgroud)

或者,正如评论中指出的那样,对于询问是否a是这样的实例的非常具体的情况IFn将起作用:

(ifn? a)
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,使用`(ifn?a)`. (12认同)
  • 不,没有针对每种类型的通用谓词,但问题是如何测试`IFn`,在这种情况下,`ifn?`我认为比使用`instance?`更惯用?同样,我会使用`string?`而不是你的第一个例子. (2认同)