^
là "nhân vật meta" nó nói với the reader để thêm biểu tượng bắt đầu với ^
như siêu dữ liệu để biểu tượng tiếp theo (với điều kiện nó là một cái gì đó mà thực hiện IMetas)
user=> (def x ^:IamMeta [1 2 3])
#'user/x
user=> x
[1 2 3]
user=> (meta x)
{:tag :IamMeta}
user=>
Bạn có thể học được rất nhiều về cách hoạt động clojure dưới mui xe bằng cách nhìn vào meta
của sự vật, cho các chức năng Ví dụ:
user=> (meta foo)
{:ns #<Namespace user>,
:name foo, :file "NO_SOURCE_PATH",
:line 5, :arglists ([s])}
này là rất thường được sử dụng cho type hints
(defn foo [^String s] (.charAt s 1))
nó thường là một ý tưởng tốt để bật cảnh báo phản ánh (set! *warn-on-reflection* true)
và sau đó thêm gợi ý kiểu cho đến những lời cảnh báo biến mất. mà không có Clojure này sẽ tìm kiếm loại toán hạng hàm tại thời gian chạy, điều này giúp bạn tránh được rắc rối phiền phức với các kiểu mặc dù với một chi phí nhỏ.
PS: tiếp theo nhân vật người đọc ưa thích của tôi là "công văn" nhân vật #
, nó rất đáng tìm hiểu về nó bên cạnh :)
PPS: đây là khác nhau trong clojure 1.2.x vs clojure 1.3.x trong Clojure 1.2.1 siêu dữ liệu không soạn khi bạn sử dụng meta-nhân vật:
user=> (def foo ^:foo ^:bar [1 2 3])
#'user/foo
user=> (meta foo)
{:tag :foo}
và trong 1.3 nó "làm điều đúng đắn" và cũng từ khóa những lựa chọn thay vì "thẻ":
user=> (def foo ^:foo ^:bar [1 2 3])
#'user/foo
user=> (meta foo)
{:foo true, :bar true}
Nguồn
2012-01-19 02:05:46
Nó không chính xác "thêm biểu tượng". Một biểu tượng được cắt ngắn cho một loại int. Nhưng điều này cũng làm việc với các chuỗi, ví dụ. '^" B ["'. Từ khóa được dịch sang các tùy chọn, ví dụ: '^: foo' được chuyển thành' {: foo true} '. Và cuối cùng, bạn có thể chỉ định bản đồ, ví dụ: '^ {: tag String: foo true: bar: baz}'. – kotarak
kotarak điểm tốt, chúng ta cũng nên đề cập đến siêu dữ liệu tạo khác nhau trong các phiên bản khác nhau của clojure và tôi tin rằng 1,3 bắt đầu copmposing chuỗi siêu dữ liệu '^: foo ^: bar [1 3 4]' –