2010-11-18 27 views
7

Có thể tạo một biến mới có siêu dữ liệu mà không phải trải qua biến "trung gian" không?Lọ Clojure với siêu dữ liệu

Nói cách khác, tôi biết tôi có thể làm như sau:

(def a-var 2) 
(def another-var (with-meta a-var {:foo :bar})) 

nhưng là có cách nào để tạo ra another-var mà không cần tạo a-var đầu tiên?

Trả lời

6

Như thế này:

user> (def ^{:foo :bar} another-var 2) 
#'user/another-var 
user> (clojure.pprint/pprint (meta #'another-var)) 
{:ns #<Namespace user>, 
:name another-var, 
:file "NO_SOURCE_FILE", 
:line 1, 
:foo :bar} 
nil 
6

Cũng lưu ý, rằng (def another-var (with-meta a-var {:foo :bar})) không đính kèm các siêu dữ liệu để các Var, nhưng đến giá trị. Và kể từ trong ví dụ của bạn a-var giữ một số nguyên, tôi sẽ không mong đợi ví dụ của bạn để làm việc ở tất cả, kể từ khi số nguyên không thể giữ siêu dữ liệu.

user=> (def a-var 2) 
#'user/a-var 
user=> (def another-var (with-meta a-var {:foo :bar})) 
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IObj (NO_SOURCE_FILE:2) 
+0

Cảm ơn. Tôi không nhận ra sự khác biệt. – Ralph

+0

Giải thích tốt! – Daniel

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