gpt4 book ai didi

ruby - 产生多个参数的链接枚举器

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

我正在尝试弄清楚 Ruby 如何处理产生多个参数的链式枚举器。看看这个片段:

a = ['a', 'b', 'c']

a.each_with_index.select{|pr| p pr}
# prints:
# ["a", 0]
# ["b", 1]
# ["c", 2]

a.each_with_index.map{|pr| p pr}
# prints:
# "a"
# "b"
# "c"

为什么 select 将参数作为数组生成,而 map 将它们作为两个单独的参数生成?

最佳答案

尝试:

a.each_with_index.map{|pr,last| p "pr: #{pr} last: #{last}"}

map 会自动解构传递给它的值。下一个问题是为什么它进行这种解构而 select 不是?

如果你看the source given on the Rdoc page for Array它们实际上是相同的,select 的不同之处仅在于它对产生的值进行了测试。一定是别处发生了什么。

如果我们看一下 Rubinius source (主要是因为我更擅长使用 Ruby 而不是 C;)对于 map(别名为 collect),它向我们展示了:

each do |*o|

所以它在讨论过程中不断地争论,而 select (别名来自 find_all)不:

each do

再次,关于原因的设计决策超出了我的范围。你必须找出是谁写的,也许问问 Matz :)


我应该补充一点,再次查看 Rubinius 源代码,map each 上的实际 splats and yield ,我不明白为什么只需要 yield splat 时你会同时执行这两项操作:

  each do |*o|
ary << yield(*o)
end

select 则不会。

each do
o = Rubinius.single_block_arg
ary << o if yield(o)
end

关于ruby - 产生多个参数的链接枚举器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14492882/

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