[英]Reflect on Clojure Function Name
如何在Clojure中使用反射來提取求值為函數的符號的函數名?
(require '[clojure.reflect :as r])
(defn foo [x] x)
(r/reflect foo)
=> {#clojure.reflect.Field ... 'gobbledygook}
關於(map :name (:members (r/reflect foo)))
嗎?
不,請不要使用str
因為它的行為有所不同。 在我的示例中,這是我所擁有的:
user=> (defn foo [x] x)
#'user/foo
user=> (str foo)
"user$foo@7cb20059"
相反,請結合使用meta
和var
調用:
(-> foo var meta)
此代碼返回變量元數據的映射。 鍵:name
將函數:name
保存為字符串:
(-> foo var meta :name)
foo
如果您還想使用ns的名稱,請執行以下操作:
user=> (-> foo var meta :ns ns-name)
user
它獲取名稱空間對象,並使用ns-name
函數作為字符串返回其名稱。
這些方法不依賴Clojure或REPL版本,因此更易於維護。
看起來我可以使用str
:
(str foo)
=> "#'my-project/foo"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.