rubyには 3.times { |i| do something }
みたいな便利なメソッドがあるが、これを二次元以上でもできたら便利かなと思ったので書いてみた。
すでにありそうな気もするし、クラスにダイレクトにメソッドを突っ込むのもどうかと思うのだが、実装例ということでとりあえず。 ;-)
[2,2].times { |i,j| puts "#{i},#{j}" }
というような感じで使います。
#
# usage: [2,2,2].times { |i,j,k| do something... }
#
class Array
def times(&block)
raise unless block_given?
return nil if empty?
dim_call__(nil, self, &block)
end
private
def dim_call__(stack, dims, &block)
stack ||= []
if dims.size == 0
block.call(*stack)
else
t = dims[0]
l = dims[1..-1]
t.times do |i|
stack.push(i)
dim_call__(stack, l, &block)
stack.pop
end
end
end
end
gist:
https://gist.github.com/chsh/0ffe801e2243059fb9f4a6d01770eaa6