簡體   English   中英

通過命名空間關鍵字訪問 map 值

[英]accessing map value by namespaced keyword

給定 clojure 中的 map, {::my-func {:meta {...}, :fn #function[hugsql.core/db-fn*]} ,自動定義,我如何檢索:fn 值?

我試過了

(get-in map [:my-func :fn])
(get-in map [::my-func :fn])
(get-in map [:current-namespace/my-func :fn])
(get-in map [:namespaces-it-could-be/my-func :fn])

這是在 hugsql/map-of-db-fns 和 hugsql/def-db-fns 的上下文中。

::x是為當前ns 編寫命名空間關鍵字的快捷方式。

user=> ::x 
:user/x 

所以這對源代碼或 REPL 中的作者來說是一種方便,但實際上並沒有打印出來。 既不是直接在上面看到的,也不是在地圖內部看到的

user=> {::x 1}
#:user{:x 1}
user=> {::x 1 :y 2}
{:user/x 1, :y 2}

所以可以預料,這里在某個時候出了問題,打印的::my-func實際上是關鍵字。 Clojure 不允許這樣的關鍵字,但是創建它們的 function 樂於接受任何廢話。

user=> (keyword ":my-func")
::my-func
user=> {(keyword ":my-func") 42}
{::my-func 42}
user=> (let [dont (keyword ":my-func") m {dont 42}] (get m dont))
42

經驗法則:不要對事物進行關鍵詞化,你自己手中沒有。 對於其他人為您定義的內容,使用字符串鍵同樣容易。 無效關鍵字比僅使用字符串更危險,它會改變含義(如:bro ken broken 、 ::bork:bork,bork )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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