You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的默认处理:

  1. 保留完整的关键字格式(带冒号):用str函数包裹关键字,比如:
(for [[k v] path] 
  [:p (str k) " " v])

这样渲染后会输出:

:db/id 17592186045542
:path/title sdf
  1. 只保留命名空间+名称(不带冒号):如果不想显示开头的冒号,可以用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:23:03