当使用name
函数时,它正确地将关键字的名称作为字符串返回,如:
(name :k) ; => "k"
在命名空间关键字上使用name
时存在问题,例如:
(name :n/k) ; => "k"
我可以使用namespace
函数正确获取我正在寻找的字符串:
(str (namespace :n/k) "/" (name :n/k)) ; => "n/k"
但出于某种原因,我觉得应该有更好的方法来获得完全限定的字符串。
最好的方法是什么?
答案 0 :(得分:7)
你的方法是最好的方法;这很难,因为将命名空间关键字转换为字符串是一个不常见的目标,而不是您经常要做的事情。如果你愿意,你可以在不重复关键字的情况下编写它:
(string/join "/" ((juxt namespace name) k))
答案 1 :(得分:6)
关键字实际上在公共final字段中存储具有相同名称空间和名称的符号,并通过在该符号的字符串表示前面添加冒号来生成字符串表示。所以,我们可以简单地询问符号,而不是前面的冒号:
(str (.-sym :foo/bar))
;= "foo/bar"
答案 2 :(得分:4)
(subs (str :foo/k) 1)
;=> "foo/k"
答案 3 :(得分:0)
基于name
:
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
方法:
https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Named.java
所以你可以这样做:
(defn full-name [k] (str (.getNamespace k) "/" (.getName k)))