Clojure中IFn和Fn的区别

3

我不理解IFn和fn之间的区别。

您能给出一些例子吗?

请提供这些函数之间的差异:

(fn? x)

(ifn? x)

他们的行为很相似。

1
请提供您对 IFnfn 的理解,以及您不清楚的内容,以便我们知道需要澄清什么。 - Piotrek Bzdyl
@PiotrekBzdyl的(fn? x)和(ifn? x)函数表现相同(大致相同)。 - Ertuğrul Çetin
1个回答

14

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 ...) 创建的)。


1
请注意, IFn 是一个正式的接口,它具有许多 apply 方法。但是, Fn 是一个空接口:它可以附加到任何类作为一种标记。 - Thumbnail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接