1, "b" => 2 } 有没有办法减少哈希并将键、值和索引作为 block 参数? 作为起点,我可以迭代哈希获取键、值和索引: h.each_with_index { |-6ren">
gpt4 book ai didi

ruby - 使用键、值和索引作为 block 参数减少散列

转载 作者:数据小太阳 更新时间:2023-10-29 08:18:04 26 4
gpt4 key购买 nike

h = { "a" => 1, "b" => 2 }

有没有办法减少哈希并将键、值和索引作为 block 参数?

作为起点,我可以迭代哈希获取键、值和索引:

h.each_with_index { |(k,v), i| puts [k,v,i].inspect }

# => ["a", 1, 0]
# => ["b", 2, 1]

但是,当我添加 reduce 时,我似乎失去了将键和值作为单独值的能力,而是将它们作为两个元素数组提供:

h.each_with_index.reduce([]) { |memo, (kv,i)| puts [kv,i].inspect }

# => [["a", 1], 0]
# => [["b", 2], 1]

没关系,我可以在 block 中执行 kv[0]kv[1],但我想要这样的东西:

h.each_with_index.reduce([]) { |memo, (k,v), i| puts [k,v,i].inspect }

我想在没有猴子补丁的情况下做到这一点。

最佳答案

也许是这样的?

h.each_with_index.reduce([]) { |memo, ((k,v), i)| puts [k,v,i].inspect }
#=> ["a", 1, 0]
#=> ["b", 2, 1]
#=> nil

您所需要的只是范围界定:((k,v), i)

请记住 reduce,我们总是必须在 block 的末尾返回对象。这是一种额外的开销,除非最后一个操作不在返回对象本身的 memo 对象上。否则它不会返回所需的结果。

同样的事情可以通过 each_with_indexwith_object 链接来实现,如下所示:

h.each_with_index.with_object([]) { |((k,v), i), memo| memo << [k,v,i].inspect }
#=> ["a", 1, 0]
#=> ["b", 2, 1]
#=> []

看到输出最后一行的数组了吗?那是我们的 memo 对象,它与我们上面使用的 reduce 不同。

关于ruby - 使用键、值和索引作为 block 参数减少散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49671362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com