我不明白IFn和Fn之间的区别。

你能举个例子吗?

请提供这些功能之间的区别:

(fn? x)

(ifn? x)


他们表现得一样。

最佳答案

Clojure文档非常清楚地描述了差异:


(fn? x)
如果x实现Fn,即通过fn创建的对象,则返回true。

(ifn? x)
如果x实现IFn,则返回true。请注意,许多数据结构
(例如集合和地图)实施IFn


您可以对其进行测试:

(fn? (fn [] nil)) ;; => true
(fn? #{}) ;; => false
(fn? {}) ;; => false
(fn? []) ;; => false
(fn? :a) ;; => false
(fn? 'a) ;; => false

(ifn? (fn [] nil)) ;; => true
(ifn? #{}) ;; => true
(ifn? {}) ;; => true
(ifn? []) ;; => true
(ifn? :a) ;; => true
(ifn? 'a) ;; => true


换句话说,fn?表示如果其参数是仅是一个函数(使用(fn ...)创建)的对象,ifn?表示该对象是否是可以像函数一样调用的对象(即使不是)不是使用(fn ...)创建的)。

10-08 11:59