詳細
※雑談レベルの話です。この記事に特に意味はありません。
複数のEnumを同時にループさせたい時に、いちいちindex指定するのが
面倒だな・・・と思う時ってありませんか?
通常のeach文のように使えたらいいのに・・・とかふと思う。
よくある前提としてリストAとBは必ず同じ要素数であり、
同時に使われる事が多い。
大体こんな風にループしますかね?(for文でもいいですけど)
list_a = ["1", "2", "3"] list_b = ["a", "b", "c"] list_a.each_with_index do |v, i| p list_a[i] p list_b[i] end (0..list_a.size - 1).each do |i| p list_a[i] p list_b[i] end
そこで実用性は無視して無理やりall_eachという名前のメソッドを実装してみた。
※あくまでジョークのようなものなのでまともに実装してません
# encoding: utf-8 require "pp" module Enumerable def all_each self[0].each_with_index do |i_v, i| eval_each = [] self.each_with_index do |j_v, j| eval_each << "self[#{j}][#{i}]" end eval_each_str = eval_each.join(",") eval_str = "yield(#{eval_each_str})" instance_eval eval_str end end end hoges = %w{hoge hige hage} numbers = %w{1 2 3} [hoges, numbers].all_each do |first, second| print "#{first}," print "#{second}\n" end puts "------------------------------------" alphas = %w{a b c} [hoges, numbers, alphas].all_each do |first, second, third| print "#{first}," print "#{second}," print "#{third}\n" end puts "------------------------------------" langs = %w{Java Ruby Perl} [hoges, numbers, alphas, langs].all_each do |first, second, third, fourth| print "#{first}," print "#{second}," print "#{third}," print "#{fourth}\n" end
出力
hoge,1 hige,2 hage,3 ------------------------------------ hoge,1,a hige,2,b hage,3,c ------------------------------------ hoge,1,a,Java hige,2,b,Ruby hage,3,c,Perl