On 11.06.2010 20:06, Jos Backus wrote:
> On Fri, Jun 11, 2010 at 03:25:06PM +0900, Robert Klemme wrote:
>> Drop your requirement. Think about it: what you require is extremely
>> hard to do. How do you expect the option parsing to work reliably in
>> light of ambiguity? If for example -e is also a valid option then what
>> do you make of this? Since you likely also want to recognize -h you
>> have the ambiguity built in right from the start.
>
> Well, while I agree with you, my colleagues will claim that Perl's
> Getopt::Long pulls it off
Several thoughts come to mind. First of all, even Perl cannot remove
the ambiguity - their implementation will simply automatically favor one
interpretation over another. For me personally Perl is not a role model
for what we should do in Ruby land. Perl has it's merits but my
preference is clearly on a clean object model and clean syntax - even if
Ruby is slower in some benchmarks.
Btw, could be that even POSIX mandates double dashes for long options.
Guideline 5:
Options without option-arguments should be accepted when grouped
behind one '-' delimiter.
http://www.opengroup.org/onlinepubs/...bd_chap12.html
This _can_ be read as exclusion of a single word option behind a single
dash. But then again POSIX does not say anything about long option names.
>> Alternatively, you could preprocess the arguments and look for "-help"
>> yourself e.g.
>>
>> ARGV.map! {|arg| '-help' == arg ? '--help' : arg}
>
> Yeah, but you'd have to do that for all the long option words.
>
> I wonder, is there an easy way to get the list of long option names from
> optparse? If there was, you could do the above replacement only on those
> elements of ARGV that are a long option, and keep bundled arguments such as
> `-Dfoo=bar' working as it wouldn't match any of the long option names.
>
> Any ideas?
Yes, you can use #instance_variable_get to access internal structures of
OptionParser. If you want to find out about internals you can either
try documentation or investigate with IRB, e.g.
http://pastie.org/1001813
You might be able to get the long option via x.long.keys where x is an
instance of OptionParser::List or analyzing OptionParser::Switch and
reading #long (see the output in pastie for navigation).
Kind regards
robert
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/