Троллоп: флаги с отрицанием не ложь, но ноль
Согласно блогу 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$