Optparse: Arguments as Arguments Unexpectedness


#1

Hi,

I am trying to use the standard optionparser to read in some arguments,
but one of those arguments is an argument itself. Is this a bug?

opt.rb:

require ‘optparse’
OptionParser.new do |opts|
opts.on(’-a’,’–args [ARGUMENTS]’,String,“arguments”) {|v| puts “Found:
#{v}”}
end.parse!

EXPECTED:
$ ruby opt.rb -a “-d me”
Found: -d me

ACTUAL:
$ ruby opt.rb -a “-d me”
Found:
/usr/lib/ruby/1.8/optparse.rb:1445:in complete': invalid option: -d me (OptionParser::InvalidOption) from /usr/lib/ruby/1.8/optparse.rb:1443:incatch’
from /usr/lib/ruby/1.8/optparse.rb:1443:in complete' from /usr/lib/ruby/1.8/optparse.rb:1282:inparse_in_order’
from /usr/lib/ruby/1.8/optparse.rb:1249:in catch' from /usr/lib/ruby/1.8/optparse.rb:1249:inparse_in_order’
from /usr/lib/ruby/1.8/optparse.rb:1243:in order!' from /usr/lib/ruby/1.8/optparse.rb:1334:inpermute!’
from /usr/lib/ruby/1.8/optparse.rb:1355:in `parse!’
from opt.rb:3


#2

Ben W. wrote:

I am trying to use the standard optionparser to read in some arguments,
but one of those arguments is an argument itself. Is this a bug?

I don’t think so. I think it’s an ambiguity because you have declared
your -a flag to take an optional argument.

Suppose your OptionParser also honoured the -d option. It would need to
choose between “-a” with argument “-d me”, and “-a” with no argument
followed by option “-d” with argument “me”. OptionParser is taking the
view that anything which starts with a dash in that case is intended to
be the next option on the line. Otherwise, the argument to the -a flag
would hardly be optional if it always consumed the next string.

If your -a option always takes an argument, then declare it as such,
without the square brackets:

require ‘optparse’
OptionParser.new do |opts|
opts.on(’-a’,’–args ARGUMENTS’,String,“arguments”) {|v| puts “Found:
#{v}”}
end.parse!

$ ruby opt.rb -a “-d me”
Found:
-d me

Otherwise, your original code works as long as you include the flag and
its argument in the same position.

$ ruby opt.rb “-a-d me”
Found:
-d me


#3

Brian C. wrote:

If your -a option always takes an argument, then declare it as such,
without the square brackets:

Thanks for the quick, informative answer and sorry for the stupidity.
ben