In general, it is said that for statement and each method call are similar, except for the scope of loop variables.
I found another difference, since 1.9.
I found each does not call Array.try_convert so only for is affected by redefinition of that method.
$ ruby -e 'a = [Struct.new(:to_ary).new([1, 2])]; def Array.try_convert(*);raise;end;a.each {|i, j| p [i, j]}; for i, j in a; p [i, j]; end'
[1, 2]
Traceback (most recent call last):
3: from -e:1:in `<main>'
2: from -e:1:in `each'
1: from -e:1:in `block in <main>'
-e:1:in `try_convert': unhandled exception