考虑
(defn f ^{:foo "bar"} [x] (* x x))
Run Code Online (Sandbox Code Playgroud)
和
(defn g #^{:foo "bar"} [x] (* x x))
Run Code Online (Sandbox Code Playgroud)
编译和运行.
我有两个问题:第一,为什么(meta f)而(meta g)只能产生nil?我原以为他们会生产{:foo "bar"}; 哇,我刚刚完全在元数据上吃午饭,我在那里定义了一些垃圾吗?
其次,元数据的两个合成元素之间有什么区别?看起来第二个是" 标记的文字 " ,与扩展数据表示法edn有关,但是如果没有更多的上下文或示例,我就不能完全了解它.
该#^元数据读取器的宏被替换 ^用Clojure 1.2.虽然目前两者之间没有区别,但旧表单已弃用,您应该^专门使用.
元数据文字应该在要附加到的项目之前:
(defn ^{:foo "bar"} f [x] (* x x))
Run Code Online (Sandbox Code Playgroud)
要记住的另一件事是上面定义中的元数据没有附加到函数,它附加到var引用函数.您可以获取f varwith 的元数据:
(meta (var f))
Run Code Online (Sandbox Code Playgroud)
或者使用var阅读器宏:
(meta #'f)
Run Code Online (Sandbox Code Playgroud)