text: Q:
  
  What is OptionsParser doing in this case?
  
  I'm going through a tutorial on OptionsParser in ruby. There is a line of code that I'm confused about:
  option_parser = OptionParser.new do |opt|
  .
  .
  .
  server_list = %w[a b c]
  opt.on("-s SERVERS","--servers SERVERS", server_list, "which server will start between #{server_list.join(',')}") do |servers|
    options[:servers] = servers
  end
  
  I understand that OptionParser#on can convert a value to a type defined for example:
  .
  .
  .
  opt.on("-e","--environment ENVIRONMENT",Numeric, "which environment you want server run") do |environment|
    puts environment #=> Fixnum
    options[:environment] = environment
  end
  
  But I haven't been able to figure out how to successfully run a ruby program that uses OptionParser as shown above. See below for what I've tried.
  ➜  ruby-cli cat 04-with_optparse_convert_values
  #!/usr/bin/env ruby
  
  require 'optparse'
  
  options = {}
  
  option_parser = OptionParser.new do |opt|
    opt.banner = "Usage: cats"
  
    opt.on("-e", "--environment ENVIRONMENT", Numeric, "environment to run") do |env|
      puts "env.class"
      p env.class
      options[:environment] = env
    end
  
    opt.on("--delay N", Float, "Delay N seconds before executing") do |n|
      options[:delay] = n
    end
  
    opt.on("-j x,y,z","--jurisdictions x,y,z", Array,
    "which jurisdiction will start") do |jurisdictions|
      options[:jurisdictions] = jurisdictions
    end
  
    server_list = %w[a b c]
    opt.on("-s SERVERS","--servers SERVERS", server_list,
    "which server will start between #{server_list.join(',')}") do |servers|
      options[:servers] = servers
    end
  
  end
  
  option_parser.parse!
  p options
  ➜  ruby-cli ./04-with_optparse_convert_values -j cats,and,dogs
  {:jurisdictions=>["cats", "and", "dogs"]}
  ➜  ruby-cli ./04-with_optparse_convert_values -j cats,and,dogs -s cats,and,dogs
  ./04-with_optparse_convert_values:33:in `<main>': invalid argument: -s cats,and,dogs (OptionParser::InvalidArgument)
  ➜  ruby-cli ./04-with_optparse_convert_values -j cats,and,dogs -s cats
  ./04-with_optparse_convert_values:33:in `<main>': invalid argument: -s cats (OptionParser::InvalidArgument)
  ➜  ruby-cli ./04-with_optparse_convert_values -j cats,and,dogs -s "cats,and,dogs"
  ./04-with_optparse_convert_values:33:in `<main>': invalid argument: -s cats,and,dogs (OptionParser::InvalidArgument)
  ➜  ruby-cli ./04-with_optparse_convert_values -j cats,and,dogs -s "cats\nand\ndogs"
  ./04-with_optparse_convert_values:33:in `<main>': invalid argument: -s cats\nand\ndogs (OptionParser::InvalidArgument)
  ➜  ruby-cli ARRAY=(cats and dogs)
  ➜  ruby-cli ./04-with_optparse_convert_values -j cats,and,dogs -s ${ARRAY[\*]}
  ./04-with_optparse_convert_values:33:in `<main>': invalid argument: -s cats (OptionParser::InvalidArgument)
  ➜  ruby-cli
  
  A:
  
  server_list = %w[a b c]
  opt.on("-s SERVERS","--servers SERVERS", server_list,
  "which server will start between #{server_list.join(',')}") do |servers|
    options[:servers] = servers
  end
  
  is providing an array of "servers" to choose from via the command line option -s so, ./04-with_optparse_convert_values -s cats wouldn't work because it is not one of the choices, but a, b, or c will. For example:
  ➜  ruby-cli ./04-with_optparse_convert_values -s a
  {:servers=>"a"}
  ➜  ruby-cli ./04-with_optparse_convert_values -s b
  {:servers=>"b"}
  ➜  ruby-cli ./04-with_optparse_convert_values -s c
  {:servers=>"c"}
  
  