Ruby中如何在Reduce哈希时获取键、值及索引作为块参数?
如何在哈希的reduce操作中同时获取键、值和索引?
当然可以实现!你已经通过each_with_index成功拿到了哈希的键、值和索引,要在reduce里做到同样的事,只需要利用Ruby的数组解构特性调整块参数的写法就行。
先看你遇到的问题:当你写h.each_with_index.reduce([]) { |memo, (kv,i)| ... }时,kv是一个包含键和值的二元数组(比如["a", 1]),没法直接拿到单独的k和v。解决方法很简单——把这个二元数组再解构一次就行。
直接解构的写法
这是最直观的方式,通过嵌套的参数解构直接拆分出键、值、索引:
h = { "a" => 1, "b" => 2 } result = h.each_with_index.reduce([]) do |memo, ((k, v), i)| # 这里可以直接使用k(键)、v(值)、i(索引)三个单独参数 puts "当前元素:键=#{k},值=#{v},索引=#{i}" memo << [k, v, i] # 示例:把元素信息存入累加器 end # 输出内容: # 当前元素:键=a,值=1,索引=0 # 当前元素:键=b,值=2,索引=1 # result最终为 [["a", 1, 0], ["b", 2, 1]]
另一种拆分方式(更灵活)
如果你觉得嵌套括号看着有点绕,也可以先拿到键值对数组,再在块内部拆分:
h.each_with_index.reduce([]) do |memo, (kv_pair, i)| k, v = kv_pair # 手动拆分键值对数组 puts [k, v, i].inspect memo # 记得返回累加器,否则reduce会出错 end
原理说明
each_with_index遍历哈希时,会给后续的reduce传递嵌套数组:每个元素是[[键, 值], 索引]的结构。Ruby的块参数支持多层解构,所以用((k, v), i)就能把这个嵌套数组一层一层拆开,直接得到三个独立的参数。
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

