2013-05-16 22 views
15

Khi name chức năng được sử dụng nó sẽ trả về một cách chính xác tên của một từ khóa như một String, như trong:Cách đúng để chuyển đổi từ khóa clojure tên thành chuỗi là gì?

(name :k) ; => "k" 

Một vấn đề tồn tại khi sử dụng name vào một từ khóa namespaced như:

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

Tôi có thể sử dụng chức năng namespace để lấy đúng chuỗi mà tôi đang tìm kiếm:

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

Nhưng vì lý do nào đó, tôi cảm thấy có một cách tốt hơn để có được chuỗi đầy đủ.

Cách tốt nhất để làm điều đó là gì?

Trả lời

5

Từ khóa thực sự lưu trữ một biểu tượng có cùng tên và tên trong trường cuối cùng công khai và tạo biểu diễn chuỗi của chúng bằng cách thêm một dấu hai chấm vào biểu diễn chuỗi ký hiệu đó. Vì vậy, chúng tôi chỉ có thể yêu cầu biểu tượng giống nhau và không thêm vào dấu hai chấm:

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

Chỉ cần thông tin: KHÔNG làm việc cho clojurescript. – ClojureMostly

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

Cách tiếp cận của bạn là cách tốt nhất để thực hiện; nó chỉ khó bởi vì việc chuyển đổi một từ khóa không gian tên thành một chuỗi là một mục tiêu không phổ biến, và không phải cái gì bạn muốn làm thường xuyên. Bạn có thể viết nó mà không lặp lại những từ khóa, nếu bạn muốn:

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

Tôi biết, trường hợp cụ thể này tôi có loại mime, ví dụ: ': text/plain' cần phải được xâu chuỗi trước khi đặt chúng lên dây. Vì vậy, chúng không chính xác _clojure_ không gian tên –

0

Dựa trên việc thực hiện 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=> 

Và cho rằng giao diện clojure.lang.Named có một phương pháp getNamespace:

https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Named.java

Vì vậy, bạn có thể thực hiện việc này:

+0

Còn về clojurescript thì sao? – Mnebuerquo

Các vấn đề liên quan