2

同じサイズの配列が多数あり、いくつかの要素があるとします。たとえば、そのうちの1つが次のようになります。

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

しかし、割り当てを行う代わりに、関数を呼び出したいです。

4

2 に答える 2

6

一連の関数を準備してから、2つを一緒に圧縮することができます。このようなもの:

# 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

しかし、私のメソッドはメソッドであり、ラムダではありません...

これは、メソッドを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
于 2012-12-13T13:55:31.223 に答える
3

セルジオの答えに追加するには、呼び出したい関数メソッドの場合、次のようにすることができます。

arr = ['a', 'b', 'c', 'd']
funcs = [:method_a, :method_b, :method_c, :method_d]

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

# or if they are methods on some other object
arr.zip(funcs) {|a, f| that_other_object.send(f, a) }
于 2012-12-13T14:15:22.710 に答える