Clojure Hiccup渲染Map键时命名空间丢失问题求助
为什么Hiccup渲染时Map的带命名空间关键字丢失了命名空间?
这个问题的核心原因是Hiccup在处理关键字(Keyword)作为元素内容时,默认会调用clojure.core/name函数来转换为字符串,而name函数只会返回关键字的「名称部分」,自动丢掉了前面的命名空间。
咱们来拆解你的代码表现:
- 终端里的
(println (keys path))能正常输出(:db/id :path/title),是因为println会用str(或者pr-str)处理关键字,str :db/id返回的是完整的字符串:db/id; - 但Hiccup渲染
[:p (keys path)]时,会把每个关键字单独用name转换:(name :db/id)返回"id",(name :path/title)返回"title",所以最终拼接成了idtitle; - 同理,你的
for和map循环里的k是关键字,Hiccup渲染时同样用name处理,所以输出的是id 17592186045542而不是:db/id 17592186045542。
解决办法:手动控制关键字的字符串转换
要保留命名空间,你需要手动把关键字转换成带命名空间的字符串,而不是依赖Hiccup的默认处理:
- 保留完整的关键字格式(带冒号):用
str函数包裹关键字,比如:
(for [[k v] path] [:p (str k) " " v])
这样渲染后会输出:
:db/id 17592186045542 :path/title sdf
- 只保留命名空间+名称(不带冒号):如果不想显示开头的冒号,可以用
namespace和name函数拼接:
(for [[k v] path] [:p (str (namespace k) "/" (name k)) " " v])
渲染后会输出:
db/id 17592186045542 path/title sdf
修改后的完整代码示例:
(layout (str "Path " (:path/title path)) [:h1 "Title: " (:title path) slug] [:p (str path)] ; 依然打印完整的Map字符串 [:p (map str (keys path))] ; 现在会显示":db/id :path/title" (for [[k v] path] [:p (str k) " " v]) ; 显示带命名空间的键值对 (map (fn [[k v]] [:p (str k) " " v]) path))
内容的提问来源于stack exchange,提问作者mwal
相关产品推荐
相关产品推荐

