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

Gui*_*ler 16 clojure

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

(name :k) ; => "k"
Run Code Online (Sandbox Code Playgroud)

name在命名空间关键字上使用时存在问题,例如:

(name :n/k) ; => "k"
Run Code Online (Sandbox Code Playgroud)

我可以使用该namespace函数来正确获取我正在寻找的字符串:

(str (namespace :n/k) "/" (name :n/k)) ; => "n/k"
Run Code Online (Sandbox Code Playgroud)

但出于某种原因,我觉得应该有更好的方法来获得完全限定的字符串.

最好的方法是什么?

ama*_*loy 7

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

(string/join "/" ((juxt namespace name) k))
Run Code Online (Sandbox Code Playgroud)


A. *_*ebb 6

(subs (str :foo/k) 1)
;=> "foo/k"
Run Code Online (Sandbox Code Playgroud)


Mic*_*zyk 6

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

(str (.-sym :foo/bar))
;= "foo/bar"
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:不适用于clojurescript. (3认同)