From: Sato Hiroshi <hirocy.f01 / plala.to>
Subject: [ruby-list:42715] n次元配列#each_index
Date: Thu, 17 Aug 2006 16:48:13 +0900

るびきちです。

> n次元配列に対するeach_indexを実現したいのですが,
> 
> nが決まっていれば難しくはないのですが,不定の場合,
> どう書けば良いのか...

再帰を使ってこんなのはどうでしょう?
each_with_indexを拡張して、indexの部分が配列になっています。
prepended_idxesは状態変数なので使う際は無視してください。

require 
class Array
  def n_each_with_index(prepended_idxes=[], &block)
    each_with_index do |x, i|
      if Array === x
        x.n_each_with_index(prepended_idxes+[i], &block)
      else
        yield(x,prepended_idxes+[i])
      end
    end
  end
end


require 'test/unit'
class TestNdimArrayIndex < Test::Unit::TestCase

  def f(ary)
    ary.enum_for(:n_each_with_index).map{|x, idxes|
      format("(%s)=%d", idxes.join(","), x)}
  end

  def test_2
    ary = [[10,27],[31,42]]
    assert_equal(["(0,0)=10", "(0,1)=27", "(1,0)=31", "(1,1)=42"], f(ary))
  end

  def test_1
    ary = [1,2,3]
    assert_equal(["(0)=1", "(1)=2", "(2)=3"], f(ary))
  end

  def test_2_1
    ary = [1, [21, 22], 3]
    assert_equal(["(0)=1", "(1,0)=21", "(1,1)=22", "(2)=3"], f(ary))
  end

end

--
rubikitch
http://www.rubyist.net/~rubikitch/