Issue #14728 has been updated by nobu (Nobuyoshi Nakada). In common, an argument is determined by the preceding option, consider `grep` command's `-e` option. If you want to disallow an argument starting with `-`, you'd need to specify a pattern ```ruby opts.on("-q","--custom MANDATORY", "custom", /\A(?!-)/) do |x| options[:custom] = x end ``` or allowed values ```ruby opts.on("-q","--custom MANDATORY", "custom", %w[A B C]) do |x| options[:custom] = x end ``` ---------------------------------------- Bug #14728: OptionParser takes other options as argument values https://bugs.ruby-lang.org/issues/14728#change-71837 * Author: xz0r (xz0r xz0r) * Status: Rejected * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16] * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- `test.rb` ~~~ ruby require 'optparse' options = {} OptionParser.new do |opts| opts.banner = "Usage: test.rb [options]" opts.on("--verbose", "Run verbosely") do |v| options[:verbose] = v end opts.on("--custom MANDATORY", "custom") do |x| options[:custom] = x end end.parse! p options ~~~ If I run the above script as follows below is output: ``` $ ruby test.rb --custom --verbose {:custom=>"--verbose"} ``` This is not the expected behaviour as `--verbose` should not be set as the option value. -- https://bugs.ruby-lang.org/ Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>