【问题标题】:How do I check if a variable implements an interface in clojure?如何检查变量是否在 clojure 中实现了接口?
【发布时间】:2012-08-29 03:15:01
【问题描述】:

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

(def a :hello)

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

【问题讨论】:

  • 为什么要这样做?这可能表明设计损坏。

标签: clojure


【解决方案1】:

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

(instance? <class-or-interface> <object>)

引用文档:

(instance? c x) 评估 x 并测试它是否是类的实例 C。返回真或假。

例如:

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

(instance? java.io.Serializable "test")
> true

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

(instance? package.of.IFn a)

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

(ifn? a)

【讨论】:

  • 更好的是,使用(ifn? a)
  • @DaveRay 怎么样?我不知道一个接口会自动带有一个测试谓词,这在文档中是哪里解释的?它是否适用于 Java 接口,例如 Serializable
  • 不,不是每种类型都有一个通用谓词,但问题是如何测试IFn,在这种情况下,ifn? 会比使用@987654334 更惯用@。同样,我会使用 string? 而不是您的第一个示例。
猜你喜欢
  • 2018-10-19
  • 1970-01-01
  • 2016-09-29
  • 2010-09-21
  • 2012-12-29
  • 2012-04-27
  • 1970-01-01
  • 2018-11-16
  • 2011-02-01
相关资源
最近更新 更多