Это мой код:
if ARGV[0] == false
puts "Usage: ./script.rb argument"
exit
end
print "Yey we got an argument: " ARGV[0]
Но я просто не могу проверить код, если ARGV [0] указан или нет, как мне это сделать?
Это мой код:
if ARGV[0] == false
puts "Usage: ./script.rb argument"
exit
end
print "Yey we got an argument: " ARGV[0]
Но я просто не могу проверить код, если ARGV [0] указан или нет, как мне это сделать?
Проверьте, если он empty?
(или проверьте его длину):
if ARGV.empty?
puts ...
exit
end
Рассмотрим использование любого из парсеров аргументов командной строки Ruby, например OptionParser.
Самый простой способ обработать позиционные аргументы (кроме использования драгоценного камня для этого) - это shift их по одному за раз:
arg1 = ARGV.shift
arg2 = ARGV.shift
Отсутствующий аргумент будет равен нулю. Позвольте использовать это, чтобы дать arg2 значение по умолчанию:
arg1 = ARGV.shift
arg2 = ARGV.shift || 'default value goes here'
Проверка требуемого аргумента тривиальна:
raise "missing argument" unless arg1
Также легко увидеть, было ли задано слишком много аргументов:
raise "too many arguments" unless ARGV.empty?
Я понимаю, что хорошее решение уже дано, но никто не упоминал о реальной причине, почему ваш пример не работал.
Проблема с вашим примером кода заключается в том, что если аргументов нет, ARGV[0]
вернет nil
, а nil == false
будет false. nil
является "ложным", но не равным false. Что вы могли бы сделать:
unless ARGV[0]
puts "Usage: ..."
exit 1
end
Что бы сработало, потому что это утверждение теперь зависит от фальсификации, а не от равенства с фактическим false
.
Но не используйте этот код, это намного яснее, если вы укажете свое фактическое намерение, которое вы хотите знать, если есть какие-либо аргументы (вместо того, является ли первый аргумент ложным). Поэтому используйте предложенный код:
if ARGV.empty?
puts "Usage..."
exit 1
end
Вы можете проверить длину ARGV
. Если он имеет нулевые элементы, то ARGV[0]
не задано.
Чтобы проверить, задан ли ARGV [0] (или больше аргументов):
puts 'Usage: ...' if ARGV.length == 0
Вы также можете использовать ARGV.пути? (Ответ @DaveNewton)
Вот что я делаю:
a = 'defaultvalue' if (a = ARGV.shift).nil?
Кто-то предложил это:
a = ARGV.shift || 'defaultvalue'
Это неверно, поскольку любое ложное значение приведет к назначению defaultvalue
, например:
args=[false]; a=args.shift||true; # a has final value true when it should be false