17

このname関数を使用すると、次のように、キーワードの名前を文字列として正しく返します。

(name :k) ; => "k"

name次のような名前空間キーワードで使用すると、問題が発生します。

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

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

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

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

それを行う最良の方法は何ですか?

4

4 に答える 4

10

キーワードは実際には、同じ名前空間と名前を持つシンボルを public final フィールドに格納し、そのシンボルの文字列表現の先頭にコロンを追加して文字列表現を生成します。したがって、コロンを先頭に追加せずに、シンボルに同じことを求めることができます。

(str (.-sym :foo/bar))
;= "foo/bar"
于 2013-05-17T00:45:19.353 に答える
7

あなたのアプローチはそれを行うための最良の方法です。名前空間付きのキーワードを文字列に変換することは珍しい目標であり、定期的に行うことを期待するものではないため、難しいだけです. 必要に応じて、キーワードを繰り返さずに記述できます。

(string/join "/" ((juxt namespace name) k))
于 2013-05-16T20:06:01.763 に答える
6
(subs (str :foo/k) 1)
;=> "foo/k"
于 2013-05-16T19:33:38.250 に答える
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)))
于 2013-05-16T20:22:34.697 に答える