原です。

|def Array.tensor(sizes, data=[], i = nil)
|  if size = sizes[0]
|    array = new(size)
|    data[-1][i] = array if i
|    data += [array]
|    array.each_index { |i|
|      tensor(sizes[1..-1], data, i) {|*x| yield(i, *x)}
|    }
|  else
|    data[-1][i] = yield if i
|    return
|  end
|  data[0]
|end

若干冗長だったので、改良版:

def Array.tensor(sizes, data=[], i = nil)
  if size = sizes[0]
    if i
      data[i] = (array = new(size))
    else
      data.push (array = new(size))
    end
    array.each_index { |i|
      tensor(sizes[1..-1], array, i) {|*x| yield(i, *x)}
    }
  else
    if i
      data[i] = yield
    else
      data.push yield
    end
  end
  data[0]
end

もうひと工夫できるかな。