Pet*_*ron 0 reflection function clojure
如何在Clojure中使用反射来提取计算为函数的符号的函数名?
(require '[clojure.reflect :as r])
(defn foo [x] x)
(r/reflect foo)
=> {#clojure.reflect.Field ... 'gobbledygook}
Run Code Online (Sandbox Code Playgroud)
关于(map :name (:members (r/reflect foo)))什么?
不,请不要使用,str因为它的行为不同.在我的例子中,这是我得到的:
user=> (defn foo [x] x)
#'user/foo
user=> (str foo)
"user$foo@7cb20059"
Run Code Online (Sandbox Code Playgroud)
相反,使用meta和var调用的组合:
(-> foo var meta)
Run Code Online (Sandbox Code Playgroud)
此代码返回变量元数据的映射.键:name将函数名称保存为字符串:
(-> foo var meta :name)
foo
Run Code Online (Sandbox Code Playgroud)
如果您还想拥有ns的名称,请执行以下操作:
user=> (-> foo var meta :ns ns-name)
user
Run Code Online (Sandbox Code Playgroud)
它获取命名空间对象并将该ns-name函数作为字符串返回其名称.
这些方法不依赖于Clojure或REPL版本,因此更易于维护.
| 归档时间: |
|
| 查看次数: |
147 次 |
| 最近记录: |