Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | 複数のEnumを同時にループさせたい時(雑談レベル)

概要

複数Enumを同時にループさせたい時(雑談レベル)

詳細

※雑談レベルの話です。この記事に特に意味はありません。
複数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