2013-05-16 11 views
15

name機能を使用する場合のように、正しく文字列としてキーワードの名前を返す:名前空間のclojureキーワードをstringに変換する正しい方法は何ですか?

(name :n/k) ; => "k" 

:のような名前空間キーワードにnameを使用するときに問題が存在

(name :k) ; => "k" 

namespace関数を使用して、探している文字列を正しく取得できます。

(str (namespace :n/k) "/" (name :n/k)) ; => "n/k" 

しかし何らかの理由で、完全修飾文字列を取得するためのより良い方法があるはずです。

これを行うにはどうすればよいでしょうか?

答えて

5

実際には、同じ名前空間と名前のシンボルを公開最終フィールドに格納し、そのシンボルの文字列表現にコロンを付けることによって文字列表現を生成します。だから、私たちは単純にシンボルを尋ねることができ、コロンの前にはコロンを付けないでください。

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

ちょうど参考までに:clojurescriptでは動作しません。 – ClojureMostly

4
(subs (str :foo/k) 1) 
;=> "foo/k" 
6

あなたのアプローチが最良の方法です。名前空間付きのキーワードを文字列に変換することは珍しいことであり、あなたが定期的にやることは期待していないことです。あなたが望んでいた場合は、キーワードを繰り返すことなく、それを書くことができます:

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.javanameの実装に基づいて

(string/join "/" ((juxt namespace name) k)) 
+0

私は知っています。 ':text/plain'を文字列にする必要があります。だから彼らはちょうど_clojure_名前空間ではない –

0

だから、これを行うことができます。

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

クロージャスクリプトではどうですか? – Mnebuerquo

関連する問題