はじめて投稿します、高野と申します。

下に添えたスクリプトを試したところ、どうも納得しにく
い結果を得ましたので相談したく思います。
アドバイスをいただけると助かります。

高野のりゆき
Ragnar Granit Instituutti, Tampereen Teknillinen Korkeakoulu.
Ragnar Granit Institute, Tampere Univ. of Tech., Tampere, Finland.

やりたかった事:
コマンドラインに書くオプションをハッシュから作る
例として、
ハッシュ h={'str'=>["aaa", "bbb"], 'n0'=>[0, 1], 'n1'=>[-10, -11]}
から文字列 '--aaa 0 -10 --bbb 1 -11' をつくる。

困ったこと:
自分にとっては、直感的には以下のスクリプトのwhile、for、
collect、each、どの方法でも同じ結果が得られるものと思っ
ていたのですが、期待したとおりの結果はwhileでしか 得られ
ず、他のケースはなぜ違った結果になったのかも分かりま
せん。自分にとって、書きやすさ読みやすさが一番
なのはcollectを使ったものなので、それが使えないのは
残念。

試したスクリプト(ruby 1.6.7 (2002-03-01) [i686-linux]で実行):
h={'str'=>["aaa", "bbb"], 'n0'=>[0, 1], 'n1'=>[-10, -11]}
# determine the mininum number of elements, n
# it must be 2 now
n=h.keys.collect{|k| h[k].length}.min

p "first elements,  --#{h['str'][0]} #{h['n0'][0]} #{h['n1'][0]}"
p "second elements, --#{h['str'][1]} #{h['n0'][1]} #{h['n1'][1]}"

byWhile = []
i = 0
while i < n
  begin
    byWhile.push("--#{h['str'][i]} #{h['n0'][i]} #{h['n1'][i]}")
    i += 1
  end
end
puts 'by while, ' + byWhile.join(' ')

byFor = []
for i in [0...n]
  byFor.push("--#{h['str'][i]} #{h['n0'][i]} #{h['n1'][i]}")
end
puts 'by for, ' + byFor.join(' ')

byCollect = [0..n].collect{|i|
  "--#{h['str'][i]} #{h['n0'][i]} #{h['n1'][i]}"
}
puts 'by collect, ' + byCollect.join(' ')

byEach = []
[0..n].each{|i|
  byEach.push("--#{h['str'][i]} #{h['n0'][i]} #{h['n1'][i]}")
}
puts 'by each, ' + byEach.join(' ')

結果:
"first elements,  --aaa 0 -10"
"second elements, --bbb 1 -11"
by while, --aaa 0 -10 --bbb 1 -11
by for, --aaabbb 01 -10-11
by collect, --aaabbb 01 -10-11
by each, --aaabbb 01 -10-11