我希望有一些东西可以定义我的UDT,如下所示
(defrecord Foo [a b])
Run Code Online (Sandbox Code Playgroud)
现在我可以声明这种类型的实例
(def f (Foo. 10 20))
Run Code Online (Sandbox Code Playgroud)
但是我如何在clojure中使用java这样的数组.
我想要new ArrayList<Foo>()(或接近),以便我可以重复调用Add方法将新的Foo添加到列表中.
似乎无法找到办法做到这一点.
编辑:
我需要告诉clojure将我的东西映射到Foo的键.所以,我需要一种方法来说明我的foo数据,然后创建一个类型为Foo的ArrayList
(defrecord Foo [a b c])
(def foo-data
[ "foo1" 1 8
"foo2" 2 7
"foo3" 3 6
"foo4" 4 5])
Run Code Online (Sandbox Code Playgroud)
我可以通过doseq访问这些,但后来我需要创建一个ArrayList,然后使用它来做一些操作.
我建议使用内置的Clojure功能,它自动创建一个构造函数:
(defrecord Foo [a b])
(->Foo 1 2) ;; auto-generated constructor
=> #user.Foo{:a 1, :b 2}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用标准的Clojure高阶函数来构造Foo你喜欢的任何集合,例如
(def foo-data [["Bob" 2]
["Fred" 4]
["Len" 6]])
(into [] (map (partial apply ->Foo) foo-data))
=> (A vector of Foos with the provided data)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |