原です。

In message "[ruby-list:10330] Re: array"
    on 98/10/26, Inaba Hiroto <inaba / st.rim.or.jp> writes:

|def Array.tensor(sizes, index = [], &block)
|  isize = index.size
|  if sizes.size == isize
|    ret = block.call(*index)
|  else
|    i = -1
|    ret = new(sizes[isize]).filter{
|      index[isize] = i += 1
|      tensor(sizes, index, &block)
|    }
|    index.pop
|  end
|  ret
|end

本質的にこれ以上のものはないですが、駄目押しに短く書いてみました。

def tensor(n = nil, *sizes)
  return yield unless n
  (0..n-1).collect { |i|
    tensor(*sizes) { |*x| yield(i, *x) }
  }
end

ちょっと仕様が変わって Array.tensor([2,3,4]) ではなく tensor(2,3,4)
と使います。