Làm thế nào để chuyển đổi một từ khóa clojure thành một chuỗi?


100

Trong ứng dụng của tôi, tôi cần chuyển đổi từ khóa clojure, ví dụ. : var_name thành một chuỗi "var_name". Bất kỳ ý tưởng làm thế nào điều đó có thể được thực hiện?

Câu trả lời:


166
user=> (doc name)
-------------------------
clojure.core/name
([x])
  Returns the name String of a string, symbol or keyword.
nil
user=> (name :var_name)
"var_name"

3
Tôi không thể tưởng tượng một câu trả lời đầy đủ hơn, nhưng chỉ để cho vui, tôi sẽ dám ai đó đưa ra nó.
Hamish Grubijan

2
@Hamish Có lẽ bằng cách thêm (source name)?
ponzao

2
Làm thế nào namehoạt động không nên được quan tâm. Docstring là hợp đồng. Bất cứ điều gì khác là một chi tiết thực hiện, không nên dựa vào.
kotarak

3
Cảm ơn kotarak! Tôi yêu chiếc áo choàng này hơn mỗi ngày! Đây là ngày thứ ba của tôi.
Santosh

4
Có lẽ câu trả lời này nên giải thích tại sao (name :foo/123/bar)là "thanh". Nếu bạn muốn đường dẫn đầy đủ của một từ khóa mà bạn cần phải sử dụng subshoặc một cái gì đó giống như(str (namespace k) "/" (name k))
AnnanFay

13

Trên thực tế, thật dễ dàng để lấy phần không gian tên của từ khóa:

(name :foo/bar)  => "bar"
(namespace :foo/bar) => "foo"

Lưu ý rằng không gian tên có nhiều phân đoạn được phân tách bằng dấu '.', Không phải dấu '/'

(namespace :foo/bar/baz) => throws exception: Invalid token: :foo/bar/baz
(namespace :foo.bar/baz) => "foo.bar"

Và điều này cũng hoạt động với các từ khóa đủ điều kiện không gian tên:

;; assuming in the namespace foo.bar
(namespace ::baz) => "foo.bar"  
(name ::baz) => "baz"

12

Lưu ý rằng câu trả lời của kotarak sẽ không trả về phần không gian tên của từ khóa, chỉ là phần tên - vì vậy:

(name :foo/bar)
>"bar"

Sử dụng nhận xét khác của anh ấy cung cấp những gì bạn yêu cầu:

(subs (str :foo/bar) 1)
>"foo/bar"

0

Chuyển đổi bất kỳ kiểu dữ liệu nào thành chuỗi không phải là một nhiệm vụ tẻ nhạt, Đây là một ví dụ bằng cách sử dụng str .

(defn ConvertVectorToString []
 (let [vector [1 2 3 4]]
 (def toString (str vector)))
  (println toString)
  (println (type toString)
(let [KeyWordExample (keyword 10)]
 (def ConvertKeywordToString (str KeyWordExample)))
  (println ConvertKeywordToString)
  (println (type ConvertKeywordToString))

(ConvertVectorToString) ;;Calling ConvertVectorToString Function

Output will be:
1234
java.lang.string
10
java.lang.string

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.