assoc-in可以更改矢量/贴图中索引/键的值.在地图中,如果某个键不存在,则它会生成一个新的键/值对.是否存在类似于向量的内容(如果索引不存在,则在该索引处生成具有该值的列表)类似于:
(reduce (fn [g [x y]] (assoc-in g [x y] y ))
[]
(for [x (range 2)
y (range 2)]
[x y]))
Run Code Online (Sandbox Code Playgroud)
上面的代码生成:
[{1 1, 0 0} {1 1, 0 0}]
Run Code Online (Sandbox Code Playgroud)
我希望它生成:
[[0 1] [0 1]]
Run Code Online (Sandbox Code Playgroud)
这有可能以一种简单的方式吗?
谢谢
编辑:更清楚,我只是想让它生成嵌套向量而不是嵌套映射(或映射向量)现在我把y作为值,但这只是一个例子.
在一般情况下,创建向量而不是地图将无法正常工作,因为您只能assoc使用现有索引或向量中的下一个索引:
user=> (assoc [:a] 0 :b) ; works because index 0 exists
[:b]
user=> (assoc [:a] 1 :b) ; works because index 1 is next
[:a :b]
user=> (assoc [:a] 2 :b) ; fails since index is out of range
IndexOutOfBoundsException clojure.lang.PersistentVector.assocN (PersistentVector.java:136)
Run Code Online (Sandbox Code Playgroud)
但是,如果你小心,你仍然可以使它工作.以下是实施assoc-in:
(defn assoc-in
[m [k & ks] v]
(if ks
(assoc m k (assoc-in (get m k) ks v))
(assoc m k v)))
Run Code Online (Sandbox Code Playgroud)
请注意,它调用条件get的true分支if.如果您希望自己的版本assoc-in使用向量,则可以添加一个空向量作为返回的默认值get:
(defn vassoc-in
[m [k & ks] v]
(if ks
(assoc m k (vassoc-in (get m k []) ks v))
(assoc m k v)))
Run Code Online (Sandbox Code Playgroud)
在您的问题中使用vassoc-in而不是assoc-in在示例代码中,[[0 1] [0 1]]就像您想要的那样.
| 归档时间: |
|
| 查看次数: |
649 次 |
| 最近记录: |