この挙動は別段問題なくて単純にコードブロックの評価順序によるものでした。 末尾に詳細を説明してますのでそちらを参照ください。 元記事 ↓ Array#sortをブロック渡しで実行したときの挙動が変 # case 1 ary = ["1", "2", "10", "11", "3", "4", "23"] p ary.sort # result: ["1", "10", "11", "2", "23", "3", "4"] #case 2 ary = ["1", "2", "10", "11", "3", "4", "23"] p ary.sort do |a, b| a.to_i <=> b.to_i end # result: ["1", "10", "11", "2", "23", "3", "4"] #case 3 ary = ["1", "2", "10", "11", "3",