Sicuramente il tuo è un approccio migliore, corretto e tra le altre cose potevo benissimo usare pp per vedere il valore di ARGV, cosa che funziona senza problemi.
Però io sicuramente sbagliando uso molto spesso irb per comodità, anche e soprattutto con rails quando devo testare in velocità.
Oggi mi sono abbattuto su questa cosa che è strana, solitamente non ho mai riscontrato problemi di questo tipo.
Comunque ho fatto un altro test e praticamente ho capito che quando chiamo irb viene modificato ARGV.
Ho fatto con test assegnando ARGV.clone ad arguments ed è filato tutto liscio.
Irb comunque è incluso nel set di comandi di ruby-debug, adesso non so fino a che punto questo sia un comportamento imprevisto, ma appena ho tempo apro un ticket anche perchè mi sono accorto che poi ARGV rimane variato anche all'uscita da irb.

code
Codice PHP:
require 'rubygems'
require 'ruby-debug'

cloned ARGV.clone
debugger
ARGV
.each {|pputs p
ex
Codice PHP:
giulio@portoxd2:~$ ruby test.rb bla1 bla2 bla3
test
.rb:6
ARGV
.each {|pputs p}
(
rdb:1pp ARGV
["bla1""bla2""bla3"]
(
rdb:1pp cloned
["bla1""bla2""bla3"]
(
rdb:1irb
irb
(main):001:0ARGV
=> ["bla2""bla3"]
irb(main):002:0cloned
=> ["bla1""bla2""bla3"]
irb(main):003:0> exit
test.rb:6
ARGV
.each {|pputs p}
(
rdb:1) continue
bla2
bla3 
Spero che torni utile