From: rubikitch Date: 2006-08-17T17:24:42+09:00 Subject: [ruby-list:42716] Re: n次元配列#each_index From: Sato Hiroshi 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/