Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 改变向量值的一般方法_Clojure - Fatal编程技术网

Clojure 改变向量值的一般方法

Clojure 改变向量值的一般方法,clojure,Clojure,如果我有 (def x [[1 2 3] [4 5 6]]) 有没有一个通用的方法把任何一个数字改成9 我知道我能行 (assoc-in x [1 1] 9) > [[1 2 3] [4 9 6]] 如果你不知道索引号,有没有办法做到这一点。或者,首先找到索引编号的方法以及您拥有的所有信息是,您想将x中的数字5更改为数字9,您可以使用: 您可以使用: 其他答案适用于您的具体情况,但如果您具有任意嵌套结构,则可以使用clojure.walk命名空间: (defn replace-valu

如果我有

(def x [[1 2 3] [4 5 6]])
有没有一个通用的方法把任何一个数字改成9

我知道我能行

(assoc-in x [1 1] 9) > [[1 2 3] [4 9 6]]
如果你不知道索引号,有没有办法做到这一点。或者,首先找到索引编号的方法以及您拥有的所有信息是,您想将x中的数字5更改为数字9,您可以使用:

您可以使用:


其他答案适用于您的具体情况,但如果您具有任意嵌套结构,则可以使用
clojure.walk
命名空间:

(defn replace-value
 [value replacement struct]
 (clojure.walk/prewalk
   (fn [x]
     (if (and (number? x) (== value x))
       replacement
       x)) struct))
当然,您可以用也可以作为arg传递的任何谓词替换
number?

(replace-value 5 9 [[[1 5] 6 5] 1 5 [2 5]])
;; [[[1 9] 6 9] 1 9 [2 9]]
编辑:缩略图更好的版本

(defn replace-value [value replacement struct] 
  (clojure.walk/prewalk-replace {value replacement} struct))

其他答案适用于您的具体情况,但如果您具有任意嵌套结构,则可以使用
clojure.walk
命名空间:

(defn replace-value
 [value replacement struct]
 (clojure.walk/prewalk
   (fn [x]
     (if (and (number? x) (== value x))
       replacement
       x)) struct))
当然,您可以用也可以作为arg传递的任何谓词替换
number?

(replace-value 5 9 [[[1 5] 6 5] 1 5 [2 5]])
;; [[[1 9] 6 9] 1 9 [2 9]]
编辑:缩略图更好的版本

(defn replace-value [value replacement struct] 
  (clojure.walk/prewalk-replace {value replacement} struct))

更简单的是
(defn replace value[value replacement struct](clojure.walk/prewalk-replace{value replacement}struct))
。谓词是多余的。您的原始谓词使用-数值相等。这是你想要的吗?例如,您不能在字符串上使用它。@Thumbnail@Joseph所以如果我现在有
(def z(atom[[a”“b”“c][d”“e”“f]])
并且我想在z上使用replace-value。因为z是一个原子,所以我必须使用swap!。因此,我尝试了
(swap!(替换值“b”“g”@z))
,但我得到了一个错误,即传递给swap的参数数目错误!。然后我尝试了
(swap!替换值“b”“g”@z)
,但我得到了一个错误:ClassCastException用户$replace\u值不能转换为clojure.lang.IAtom clojure.core/swap!(core.clj:2253)。是否可以对原子使用替换值?替换结构中的结构化元素时,总会出现异常。常见的解决方案是将结构化元素包装到记录中。将结构化元素包装到记录中是什么意思?更简单的方法是
(defn replace value[value replacement struct](clojure.walk/prewalk-replace{value replacement}struct))
。谓词是多余的。您的原始谓词使用-数值相等。这是你想要的吗?例如,您不能在字符串上使用它。@Thumbnail@Joseph所以如果我现在有
(def z(atom[[a”“b”“c][d”“e”“f]])
并且我想在z上使用replace-value。因为z是一个原子,所以我必须使用swap!。因此,我尝试了
(swap!(替换值“b”“g”@z))
,但我得到了一个错误,即传递给swap的参数数目错误!。然后我尝试了
(swap!替换值“b”“g”@z)
,但我得到了一个错误:ClassCastException用户$replace\u值不能转换为clojure.lang.IAtom clojure.core/swap!(core.clj:2253)。是否可以对原子使用替换值?替换结构中的结构化元素时,总会出现异常。一种常见的解决方案是将结构化元素包装到记录中。将结构化元素包装到记录中是什么意思?