代码之家  ›  专栏  ›  技术社区  ›  Ralph java.is.for.desktop

带元数据的Clojure变量

  •  7
  • Ralph java.is.for.desktop  · 技术社区  · 14 年前

    不经过“中间”变量就可以用元数据创建一个新的var吗?

    换句话说,我知道我可以做到以下几点:

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

    但是有没有办法创造 another-var 不创造 a-var 第一?

    2 回复  |  直到 14 年前
        1
  •  6
  •   harto    14 年前

    这样地:

    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
    
        2
  •  6
  •   kotarak    14 年前

    还要注意的是 (def another-var (with-meta a-var {:foo :bar})) 不将元数据附加到 风险价值 ,但对于 价值 . 在你的例子中 a-var 保存一个整数,我根本不希望您的示例起作用,因为整数不能保存元数据。

    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)