gpt4 book ai didi

ruby - 在每个数组元素上应用不同函数的最短方法是什么?

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

假设我有许多相同大小的数组,其中包含一些元素,例如其中之一可能是:

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

我想在每个元素上调用一个不同的函数,这取决于它的索引,所以我可以这样做:

arr.each_with_index do do |el, idx| 
case idx
when 0
functionA el
when 1
functionB el
# and so on..
end
end

有没有更短的方法来做到这一点?类似于分配给变量的东西:

a, b, c, d = arr

但我想调用函数,而不是进行赋值。

最佳答案

您可以准备一个函数数组,然后将两者压缩在一起。像这样:

# stabby lambdas instead of methods. Because methods aren't objects.
func_a = ->(el) { puts "1 for #{el}" }
func_b = ->(el) { puts "2 for #{el}" }
func_c = ->(el) { puts "3 for #{el}" }


arr = ['a', 'b', 'c', 'd']
funcs = [func_a, func_b, func_c, func_a] # reusing func_a

arr.zip(funcs) {|a, f| f.call(a) }

# >> 1 for a
# >> 2 for b
# >> 3 for c
# >> 1 for d

但我的方法是方法,不是 lambda...

这里有一个技巧,如何将方法转换为 proc 对象,以便您可以将它们放在数组中并稍后调用。但是请注意,与常规方法相比,这些调用的成本更高(应该无关紧要,除非您已经从 CPU 中挤出周期)

def func_a el; puts "1 for #{el}"; end
def func_b el; puts "2 for #{el}"; end
def func_c el; puts "3 for #{el}"; end


arr = ['a', 'b', 'c', 'd']
funcs = [method(:func_a), method(:func_b), method(:func_c), method(:func_a)] # reusing func_a

arr.zip(funcs) {|a, f| f.call(a) }

# >> 1 for a
# >> 2 for b
# >> 3 for c
# >> 1 for d

关于ruby - 在每个数组元素上应用不同函数的最短方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13861151/

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