【问题标题】:Is there a way to perform Clojure-oriented reflection?有没有办法执行面向 Clojure 的反射?
【发布时间】:2015-02-23 22:57:19
【问题描述】:

如果我有类似的功能

(defn ab_func [a b]
  (* a b))

如何使用反射来确定 ab_func 有两个参数? clojure.reflect 似乎是 Java 反射机制的前端......我正在寻找某种程度的反射,它不需要了解 clojure 的 Java 实现。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    函数变量具有关联的元数据,可让您确定函数采用的参数数量,例如:

    (-> (meta #'ab_func) :arglists first count)
    => 2
    

    【讨论】:

    • 这是最接近 Clojure 的通用反射机制,但请注意,它仅适用于使用 defn 定义的函数。由于元数据附加到 var,因此它不适用于使用 (fn) 创建的匿名函数。
    • 知道这一点真的很有用,谢谢。似乎是一个奇怪的疏忽。
    【解决方案2】:

    您可以通过调用(meta #'ab_func) 来访问函数的参数列表。

    (另外,名称ab-funcab_func 更符合Clojure 命名约定。)

    【讨论】:

    • 感谢您提供有关命名约定的说明……我只是在学习 clojure。
    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    相关资源
    最近更新 更多