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