我是clojure的新手,并在clojure docs中注意到了这个例子。
this.state.action_name
输出: undefined
任何人都可以解释代码的逻辑吗?
答案 0 :(得分:4)
reduce
将函数应用于累加器和序列中的每个元素,从而构建最终结果。 ClojureDocs将the signature for reduce作为(reduce f coll)
或(reduce f val coll)
。您的示例具有后一个签名,其元素匹配如下:
f
:应用于每个条目(fn [m [k v]] ...
val
:初始累加器{}
coll
:要对{:b 2 :a 1 :c 3}
请注意,reduce调用的第二个和第三个参数之间没有分隔符(即空格)。 Clojure不需要一个。
然后,查看内部匿名函数:(fn [m [k v]] (assoc m v k))
。第一个参数m
是累加器的当前值,在reduce开始时为{}
。 Destructuring syntax用于第二个参数,即要被抛出的当前值,即映射条目。地图条目被解构为其键k
和值v
。匿名函数的主体简单地放了一个新的"反转"进入累加器(即映射),以便原始序列v
的值是键,键k
成为值。结果类似于应用Clojure API函数map-invert。
请注意,有一个单独的reduce-kv函数用于减少关联集合(例如,地图)。 reduce-kv
"为你进行解构"。这允许将匿名函数写为:
(fn [m k v] (assoc m v k))
或者更简单地使用简短的符号:
#(assoc %1 %3 %2)
答案 1 :(得分:0)
第一个地图是空的,是一个可选的初始化值,它是传递给reduce函数的第一个参数。第二个地图是要减少其项目的集合。在这种情况下,每个项目都是MapEntry
,它们作为第二个参数一次一个地传递给reduce函数。
假设您的输入映射有三个键/值对,则还原函数将被调用三次。 reduce函数的m
参数引用第一次调用的初始化值(空映射),分解的第二个参数k and v
来自MapEntry
在迭代中传递对。
虽然reduce函数大多数时候会在操作后返回第一个参数,但在您的示例中,它会反转第二个参数的键/值并将新对与初始化值相关联,并不是严格要求所以..
答案 2 :(得分:0)
这意味着reduce
具有函数{:b 2 :a 1 :c 3}
的地图(fn [m [k v]] (assoc m v k))
,它从地图中依次获取键值对[k v]
,并将其与累加器hash-map {{相关联1}}。累加器哈希映射的初始状态设置为空(m
)。