繁体   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