簡體   English   中英

反思Clojure函數名稱

[英]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"

相反,請結合使用metavar調用:

(-> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM