Ruby optparser 中的不必要参数

Ami*_*eli 3 ruby command-line-interface optparse

我在解析命令行选项时遇到以下代码问题

#!/usr/bin/env ruby
require 'optparse'

options = {:username=>nil}
optparse = OptionParser.new do|opts|
    # Define the options, and what they d
    opts.on( "--username", "Cassandra username" ) do |username|
        options[:username] = username
    end

    opts.on( '--password', 'Cassandra password' ) do |password|
        options[:password] = password
    end

    opts.on( '--keyspace', 'Cassandra keyspace' ) do |keyspace|
        options[:keyspace] = keyspace
    end
end
puts ARGV

optparse.parse!(ARGV)

puts options
Run Code Online (Sandbox Code Playgroud)

当我从命令行运行此代码时

./testopt.rb --username=uuuuu --password=xxxxxx --keyspace=test
Run Code Online (Sandbox Code Playgroud)

我得到以下输出

--username=uuuuu
--password=xxxxxx
--keyspace=test
./testopt.rb:25:in `<main>': needless argument: --username=uuuuu (OptionParser::NeedlessArgument)
Run Code Online (Sandbox Code Playgroud)

缺少什么?我在ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]

提前致谢

Fel*_*lix 5

尽管@mudasobwas 的答案本身并没有错,但您可以"option=value"通过指定如下示例中的选项来进行解析(嗯,仅使用 ruby​​ 2.3.1 测试)。

关键是使用opts.on('--username=USER',...vs. opts.on('--username',....

#!/usr/bin/env ruby
require 'optparse'

options = {:username=>nil}
optparse = OptionParser.new do|opts|
    # Define the options, and what they do
    opts.on( "--username=USER", 'Cassandra username' ) do |username|
        options[:username] = username
    end

    opts.on( '--password=PASSWORD', 'Cassandra password' ) do |password|
        options[:password] = password
    end

    opts.on( '--keyspace=KEY', 'Cassandra keyspace' ) do |keyspace|
        options[:keyspace] = keyspace
    end
end
puts ARGV

optparse.parse!(ARGV)

puts options
Run Code Online (Sandbox Code Playgroud)

您不会失去使用这种方法传递没有等号的值并将其转换为字符串的能力:

?  ~  /tmp/op.rb --username myuser           
--username
myuser
{:username=>"myuser"}
?  ~  /tmp/op.rb --username=myuser
--username=myuser
{:username=>"myuser"}
Run Code Online (Sandbox Code Playgroud)