gpt4 book ai didi

ruby - 映射枚举器

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

在 Ruby 中使用 Enumerator 非常简单:

a = [1, 2, 3]
enumerator = a.map
enumerator.each(&:succ) # => [2, 3, 4]

但是我可以对嵌套集合做类似的事情吗?

a = [[1, 2, 3], [4, 5, 6]]
a.map(&:map) # => [#<Enumerator: [1, 2, 3]:map>, #<Enumerator: [4, 5, 6]:map>]

但是现在如何获取 [[2, 3, 4], [5, 6, 7]]

这总是可以用一个 block 来完成:

a = [[1, 2, 3], [4, 5, 6]]
a.map { |array| array.map(&:succ) } # => [[2, 3, 4], [5, 6, 7]]

但我想知道是否有一种方法可以避免使用 block ,部分原因是我觉得必须键入 |array| 很烦人数组,部分原因是我很想找到一种方法来做到这一点。

理想情况下,它会像这样的伪代码:

a.map.map(&:succ)
# perhaps also something like this
a.map(&:map).apply(&:succ)

最佳答案

我知道的唯一方法是执行以下操作:

a = [[1, 2, 3], [4, 5, 6]]
a.map { |b| b.map(&:succ) } # => [[2, 3, 4], [5, 6, 7]]

主要是因为Array#map的组合/Enumerable#mapSymbol#to_proc ,您不能将第二个变量传递给 #map 生成的 block ,从而将另一个变量传递给内部 #map:

a.map(1) { |b, c| c } # c => 1, but this doesn't work :(

因此您必须使用 block 语法; Symbol#to_proc 实际上返回一个接受任意数量参数的过程(你可以通过执行 :succ.to_proc.arity 来测试它,它返回 -1)。第一个参数用作接收者,接下来的几个参数用作方法的参数 - 这在 [1, 2, 3].inject(&:+) 中进行了演示。然而,

:map.to_proc.call([[1, 2, 3], [4, 5, 6]], &:size) #=> [3, 3]

如何? :map.to_proc 创建这个:

:map.to_proc # => proc { |receiver, *args, &block| receiver.send(:map, *args, &block) }  

然后用数组的数组作为参数调用它,用这个 block :

:size.to_proc # => proc { |receiver, *args, &block| receiver.send(:size, *args, &block) }

这导致 .map { |receiver| receiver.size 被有效调用。

这一切都导致了这一点 - 因为 #map 不接受额外的参数,并将它们作为参数传递给 block ,所以你必须使用 block 。

关于ruby - 映射枚举器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31731741/

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