将带名称空间的clojure关键字转换为字符串的正确方法是什么?

将带名称空间的clojure关键字转换为字符串的正确方法是什么?,clojure,Clojure,当使用name函数时,它会正确地将关键字的名称作为字符串返回,如下所示: (name :k) ; => "k" 对命名空间关键字使用name时存在问题,例如: (name :n/k) ; => "k" 我可以使用namespace函数正确获取我要查找的字符串: (str (namespace :n/k) "/" (name :n/k)) ; => "n/k" 但出于某种原因,我觉得应该有更好的方法来获得完全限定的字符串 最好的方法是什么?你的方法是最好的方法;这很难,因为

当使用
name
函数时,它会正确地将关键字的名称作为字符串返回,如下所示:

(name :k) ; => "k"
对命名空间关键字使用
name
时存在问题,例如:

(name :n/k) ; => "k"
我可以使用
namespace
函数正确获取我要查找的字符串:

(str (namespace :n/k) "/" (name :n/k)) ; => "n/k"
但出于某种原因,我觉得应该有更好的方法来获得完全限定的字符串


最好的方法是什么?

你的方法是最好的方法;这很难,因为将名称空间的关键字转换为字符串是一个不常见的目标,而不是您希望经常做的事情。如果需要,您可以在不重复关键字的情况下编写:

(subs (str :foo/k) 1)
;=> "foo/k"
(string/join "/" ((juxt namespace name) k))

基于
名称的实现

user=> (source name)
(defn name
  "Returns the name String of a string, symbol or keyword."
  {:tag String
   :added "1.0"
   :static true}
  [x]
  (if (string? x) x (. ^clojure.lang.Named x (getName))))
nil
user=>
并且假定
clojure.lang.Named
接口有一个
getNamespace
方法:

所以你可以这样做:

(defn full-name [k] (str (.getNamespace k) "/" (.getName k)))

关键字实际上将具有相同名称空间和名称的符号存储在公共final字段中,并通过在该符号的字符串表示形式前加冒号来生成其字符串表示形式。因此,我们可以简单地要求相同的符号,而不在冒号前面加上前缀:

(str (.-sym :foo/bar))
;= "foo/bar"

我知道,在这种特殊情况下,我有一些mime类型,例如,text/plain,需要在将它们连接到网络之前进行字符串化。所以它们并不完全是clojure名称空间clojurescript中的内容是什么?它有内置的inis-
(名称空间:foo/bar)
->
“foo”
,和
(名称:foo/bar)
->
“bar”