Троллоп: флаги с отрицанием не ложь, но ноль

Согласно блогу Trollop, логические параметры в версии 2.0 приведут к тому, что этому параметру либо будет присвоено значение true или же false, Пример с этого сайта:

Например:

 opt :magic, "Use magic", :default => true

С помощью --magic приведет к :magic => true, а также --no-magic приведет к :magic => falseи не использовать ни один из них приведет к :magic => true,

Давайте проверим это.

jdibling@hurricane:~/dev/ruby/decoder$ cat hacks2.rb 
#!/usr/bin/env ruby

require 'trollop'

options = Trollop::options do
    banner "tester for trollop"
    opt :magic, "Use magic", :default => true
end

puts "Args: #{ARGV}\nMagic: #{options.magic} (#{options.magic.class})"


jdibling@hurricane:~/dev/ruby/decoder$  ruby --version
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]
jdibling@hurricane:~/dev/ruby/decoder$ gem list --local

*** LOCAL GEMS ***

gli (1.3.0)
trollop (2.0)
jdibling@hurricane:~/dev/ruby/decoder$ ./hacks2.rb
Args: []
Magic: true (TrueClass)
jdibling@hurricane:~/dev/ruby/decoder$ ./hacks2.rb --magic
Args: []
Magic: true (TrueClass)
jdibling@hurricane:~/dev/ruby/decoder$ ./hacks2.rb --no-magic
Args: []
Magic:  (NilClass)
jdibling@hurricane:~/dev/ruby/decoder$ 

С помощью --no-magic не привело к :magic => false, Я мог бы сделать что-то вроде:

options.magic = false if options.magic.nil?

Но я не хочу. Это победило бы одну из целей использования троллопа в первую очередь.

Я что-то не так делаю, или это ошибка в тролле?

2 ответа

Решение

Похоже, что Trollop возвращает параметры в виде хэша. Это похоже на работу:

require 'trollop'

options = Trollop::options do
  banner "tester for trollop"
  opt :magic, "Use magic", :default => true
end

puts "Args: #{ARGV}\nMagic: #{options.magic} (#{options.magic.class})"
puts "Inspecting options: #{options.inspect}"
puts "#{options[:magic]}"

Возвращает:

Args: 
Magic:  (NilClass)
Inspecting options: {:help=>false, :magic=>false, :magic_given=>true}
false

Я делал это неправильно.

options вот Hash, Я получал к нему доступ, как будто magic были членом options,

То, что я должен был сделать, было options[:magic], скорее, чем options.magic,

Например:

#!/usr/bin/env ruby

require 'trollop'

options = Trollop::options do
    banner "tester for trollop"
    opt :magic, "Use magic", :default => true
end

# options.magic = false if options.magic.nil?

puts "Args: #{ARGV}\nMagic: #{options[:magic]} (#{options[:magic].class}) nil? #{options[:magic].class.nil?}"

Теперь это работает (точнее, я использую это) правильно:

jdibling@hurricane:~/dev/ruby/decoder$ ./hacks2.rb --no-magic
Args: []
Magic: false (FalseClass) nil? false
jdibling@hurricane:~/dev/ruby/decoder$ 
Другие вопросы по тегам